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=101
Details 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
'programing' 카테고리의 다른 글
HTML 텍스트 입력에서 텍스트를 선택할 때 강조 색상 변경 (0) | 2021.01.14 |
---|---|
mysql_escape_string VS mysql_real_escape_string (0) | 2021.01.14 |
GUI 다운로더없이 NLTK 말뭉치 / 모델을 프로그래밍 방식으로 설치 하시겠습니까? (0) | 2021.01.14 |
ListView.addHeaderView ()를 호출 할 때 ClassCastException이 발생합니까? (0) | 2021.01.14 |
파이썬에서 여러 줄의 원시 입력을 어떻게 읽습니까? (0) | 2021.01.14 |