programing

RedirectToAction에 모델을 어떻게 포함합니까?

goodcopy 2021. 1. 14. 23:13
반응형

RedirectToAction에 모델을 어떻게 포함합니까?


에서 RedirectToAction아래, 나는를 전달하고 싶습니다 viewmodel. 모델을 리디렉션에 어떻게 전달합니까?

모델이 올바르게 생성되었는지 확인하기 위해 모델 값을 확인하는 중단 점을 설정했습니다. 정확하지만 결과보기에는 모델 속성에서 찾은 값이 포함되지 않습니다.

//
// model created up here...
//
return RedirectToAction("actionName", "controllerName", model);

ASP.NET MVC 4 RC


RedirectToAction 클라이언트 브라우저에 302 응답을 반환하므로 브라우저는 브라우저에 제공된 응답의 위치 헤더 값에있는 url에 새로운 GET 요청을합니다.

간단한 린 플랫 뷰 모델을 두 번째 작업 메서드에 전달하려는 경우이RedirectToAction 메서드 오버로드사용할 수 있습니다 .

protected internal RedirectToRouteResult RedirectToAction(
    string actionName,
    string controllerName,
    object routeValues
)

RedirectToAction전달 된 객체 (routeValues)를 쿼리 문자열로 변환하고이를 url (우리가 전달한 처음 2 개의 매개 변수에서 생성됨)에 추가하고 결과 URL을 응답 위치 헤더에 포함합니다.

뷰 모델이 다음과 같다고 가정 해 봅시다.

public class StoreVm
{
    public int StoreId { get; set; }
    public string Name { get; set; }
    public string Code { set; get; } 
}

그리고 첫 번째 액션 메소드에서이 객체를 다음과 같이 RedirectToAction메소드에 전달할 수 있습니다.

var m = new Store { StoreId =101, Name = "Kroger", Code = "KRO"};
return RedirectToAction("Details","Store", m);

이 코드는 위치 헤더 값을 다음과 같이 브라우저에 302 응답으로 보냅니다.

Store/Details?StoreId=101&Name=Kroger&Code=KRO

Details작업 메서드의 매개 변수가 유형 이라고 가정하면 StoreVm쿼리 문자열 매개 변수 값이 매개 변수의 속성에 올바르게 매핑됩니다.

public ActionResult Details(StoreVm model)
{
  // model.Name & model.Id will have values mapped from the request querystring
  // to do  : Return something. 
}

위의 내용은 작은 평면 린 뷰 모델을 전달하는 데 효과적입니다. 그러나 복잡한 개체를 전달하려면 PRG 패턴을 따라야합니다.

PRG 패턴

PRG는 POST - REDIRECT - GET을 의미합니다 . 이 접근 방식을 사용하면 두 번째 GET 작업 메서드가 리소스를 다시 쿼리하고보기에 무언가를 반환 할 수있는 쿼리 문자열에 고유 ID가있는 리디렉션 응답을 발행합니다.

int newStoreId=101;
return RedirectToAction("Details", "Store", new { storeId=newStoreId} );

그러면 URL이 생성되고 Store/Details?storeId=101Details GET작업에서 전달 된 storeId를 사용하여 StoreVm어딘가 (서비스 또는 데이터베이스 쿼리 등)에서 객체를 가져 오거나 빌드합니다.

public ActionResult Details(string storeId)
{
   // from the storeId value, get the entity/object/resource
   var store = yourRepo.GetStore(storeId);
   if(store!=null)
   {
      // Map the the view model
      var storeVm = new StoreVm { Id=storeId, Name=store.Name,Code=store.Code};
      return View(storeVm);
   }
   return View("StoreNotFound"); // view to render when we get invalid store id
}

TempData

PRG 패턴을 따르는 것이이 사용 사례를 처리하는 더 나은 솔루션입니다. 하지만 그렇게하고 싶지 않고 Stateless HTTP 요청을 통해 복잡한 데이터를 전달하려는 경우 다음과 같은 임시 저장 메커니즘을 사용할 수 있습니다.TempData

TempData["NewCustomer"] = model;
return RedirectToAction("Index", "Users");

And read it in your GET Action method again.

public ActionResult Index()
{      
  var model=TempData["NewCustomer"] as Customer
  return View(model);
}

TempData uses Session object behind the scene to store the data. But once the data is read the data is terminated.

Rachel has written a nice blog post explaining when to use TempData /ViewData. Worth to read.

Using TempData to pass model data to a redirect request in Asp.Net Core

In Asp.Net core, you cannot pass complex types in TempData. You can pass simple types like string, int, Guid etc.

If you absolutely want to pass a complex type object via TempData, you have 2 options.

1) Serialize your object to a string and pass that.

Here is a sample using Json.NET to serialize the object to a string

var s = Newtonsoft.Json.JsonConvert.SerializeObject(createUserVm);
TempData["newuser"] = s;
return RedirectToAction("Index", "Users");

Now in your Index action method, read this value from the TempData and deserialize it to your CreateUserViewModel class object.

public IActionResult Index()
{
   if (TempData["newuser"] is string s)
   {
       var newUser = JsonConvert.DeserializeObject<CreateUserViewModel>(s);
       // use newUser object now as needed
   }
   // to do : return something
}

2) Set a dictionary of simple types to TempData

var d = new Dictionary<string, string>
{
    ["FullName"] = rvm.FullName,
    ["Email"] = rvm.Email;
};
TempData["MyModelDict"] = d;
return RedirectToAction("Index", "Users");

and read it later

public IActionResult Index()
{
   if (TempData["MyModelDict"] is Dictionary<string,string> dict)
   {
      var name = dict["Name"];
      var email =  dict["Email"];
   }
   // to do : return something
}

I always like to add a property

public string ActionName { get; set; }

to my ViewModel (and usually to my Model as well). from there I use

`@Html.Action(@Model.ActionName, someModelRouteValues)

I actually store the "ActionName" in the db entity. That way it's not about the View. It's about the data in the DB entity model (which you can easily manipulate).

ReferenceURL : https://stackoverflow.com/questions/11209191/how-do-i-include-a-model-with-a-redirecttoaction

반응형