MVC-RedirectToAction ()으로 데이터 전달
MVC 사용자 양식에 입력 한 데이터를 다른보기에 표시하고 싶습니다.
클래스에는 다음과 같은 개인 변수가 있습니다.
IList<string> _pagecontent = new List<string>();
다음 작업은 FormCollection 개체를 수락하고 유효성을 검사 한 다음 "미리보기"보기에 목록으로 전달합니다.
[Authorize(Roles = "Admins")]
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateContent(FormCollection collection)
{
if (ModelState.IsValid)
{
string PageToInsert = collection["PageToInsert"];
string PageHeader = collection["PageHeader"];
string PageBody = collection["PageBody"];
//validate, excluded...
_pagecontent.Add(PageToInsert);
_pagecontent.Add(PageHeader);
_pagecontent.Add(PageBody);
}
return RedirectToAction("Preview", _pagecontent);
}
미리보기보기에는 강력한 형식의 개체 목록을 전달하기위한 다음 페이지 지시문이 있습니다.
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Template.Master" Inherits="System.Web.Mvc.ViewPage<List<string>>" %>
Model 개체를 사용하여 데이터를 가져올 수있을 것으로 기대하지만 아쉽게도 그렇게 할 수 없습니다. 다음 줄 error index out of bounds
에서 인덱스가 음수가 아니고 컬렉션 크기보다 작아야한다는 예외 가 발생합니다.
<% if (Model[0].ToString() == "0") { %>
URL에 몇 가지 이상한 매개 변수가 추가되었습니다. http://localhost:1894/Admin/Preview?Capacity=4&Count=3
그래서 두 가지 질문이 있습니다.
- RedirectToAction을 호출하고 내 List를 전달할 때 뷰의 Model 개체에서 액세스 할 수없는 이유는 무엇입니까?
- 내가하려는 일을 수행하는 적절한 방법은 무엇입니까? 즉, 문자열 컬렉션을 뷰에 전달하여 거기에 표시합니까?
TempData를 사용해보십시오. 단일 샷 세션 개체와 같습니다. 원하는 값을 TempData에 넣고 즉시 리디렉션하여 꺼내십시오. 여기에 좋은 글이 있습니다 : http://blogs.teamb.com/craigstuntz/2009/01/23/37947/
TempData를 사용할 때주의하십시오. 단일 서버 환경에서는 훌륭하게 작동하지만 클라우드 환경에서는 요청이 동일한 시스템에 도달한다는 것을 보장 할 수 없기 때문에 예상대로 작동하지 않을 수 있습니다. 이는 TempData가 asp.net 세션에 의존하기 때문에 발생합니다. 그러나 SQL 또는 AppFabric Cache와 같은 다른 세션 관리자를 사용하는 경우 제대로 작동합니다.
RedirectAction의 두 번째 매개 변수는 모델이 아닌 routeValues입니다.
protected internal RedirectToRouteResult RedirectToAction(string actionName, object routeValues);
모델에 TempData를 사용해보십시오. 리디렉션간에 데이터를 유지하기위한 것입니다.
RedirectToAction의 문제는 HTTP 302를 반환하고 브라우저가 자체적으로 새로운 HTTP 요청을 수행한다는 것입니다. 요청간에 데이터를 유지하기 위해 쿠키 및 / 또는 세션 개체를 사용하는 것이 좋습니다.
RedirectToAction이 실제로 Http 302를 브라우저에 다시 보내므로 작동하지 않습니다. 브라우저가이 302를 수신하면 서버에 새 페이지를 요청하는 새 요청을 수행합니다. 새로운 요청, 새로운 임시 변수.
또한 무언가를 저장 / 편집 / 삭제하려고 할 때이 문제가 발생하고 어떤 이유로 든이를 거부하고 이전 양식을 다시 반환해야합니다.
따라서 대신 :
return RedirectToAction("Preview", _pagecontent);
미리보기 논리를 별도의 메서드에 넣고 호출하기 만하면됩니다.
return PreviewLogic(_pagecontent);
또한 TempData [] dic를 사용하여 다른 사람들이 말한 것처럼 다음 요청에 대한 데이터를 유지할 수 있지만 서버에 대한 302 추가 왕복을 피할 수는 없습니다.
다음과 같이하려는 것 같습니다.
public ActionResult UpdateContent(FormCollection form) {
...
return View("Preview", _pagecontent);
}
리디렉션은 브라우저에 대한 "깨끗한 슬레이트"로 간주됩니다 (인증 쿠키와 같은 항목 제외). 다음 요청은 독자적으로 수행 할 수 있어야하기 때문에 브라우저에 다음 요청에 정보를 전달하도록 지시 할 수 없습니다. 다음으로 요청할 URL을 브라우저에 알리기 만하면됩니다. ASP.NET MVC에서 arguments-object를에 전달하면 RedirectToAction
해당 개체의 공용 속성이 생성 된 URL에 쿼리 문자열 매개 변수로 추가됩니다.
같은 이름으로 2 개의 작업 결과를 만들고 그중 1 개를 HttpPost로 표시하면 안 되나요?
public ActionResult UpdateContent(FormCollection preview = null)
{
return View(preview);
}
[HttpPost]
public ActionResult UpdateContent(FormCollection collection = null, bool preview = false)
{
if (preview)
return UpdateContent(collection);
else
return UpdateContent(null);
}
It looks like you are looking for the UpdateModel command:
Check out ScottGu's blog post on the topic:
Improved UpdateModel and TryUpdateModel methods
참고URL : https://stackoverflow.com/questions/672143/mvc-passing-data-with-redirecttoaction
'Programing' 카테고리의 다른 글
오류 : com.google.gms : google-services : 4.2.0을 찾을 수 없습니다. (0) | 2020.12.09 |
---|---|
C에서 'char **'를 'const char * const *'로 변환 할 수없는 이유는 무엇입니까? (0) | 2020.12.09 |
char의 길이는 정확히 8 비트입니까? (0) | 2020.12.09 |
파일 또는 디렉토리가 변경 될 때 쉘 스크립트를 실행하는 방법은 무엇입니까? (0) | 2020.12.09 |
필요한 HTTP 응답 헤더 (0) | 2020.12.09 |