2009-03-18 4 views
24

시스템에 티켓을 저장하는 코드가 있습니다. 오류가 있으면 RedirectToAction을 수행합니다. 문제는 새로운 작업에서 실수를하지 않는 것 같습니다. 이 문제를 어떻게 해결할 수 있습니까?RedirectToAction을 사용할 때 ModelState 오류를 어떻게 유지합니까?

ModelState.AddModelError("_FORM", "Unable to save ticket"); 
ModelState.AddModelError("_FORM", "Phone number was invalid."); 
ModelState.AddModelError("_FORM", "Lane number is required."); 
return RedirectToAction("CreateStep", "Ticket"); 

나는 TempData를 사용하여 제안한 것들을 알고 있지만 어떻게 ModelState에서 각각의 오류가 발생합니까?

감사합니다.

답변

-3

리디렉션을 할 때 모델 상태가 상실 될 수 있습니다.

<%= Html.ValidationMessage("property_name") %> 
+1

포럼에 나에게 가장 자극 한 것은, 내가 한 가지 부탁 할 때, 사람들은 뭔가 다른 대답이다. 그리고 여기 나는 똑같은 짓을 했어! –

3

tempdata이 하나 저장되어있는 TempData [] 컬렉션

를 사용하여 오류 메시지를 얻을 수

public ActionResult Save() 
{ 
    // your code... 
    if(saveSucceeded) 
    { 
    return View("Saved"); 
    } 
    else 
    { 
    return View("Create"); 
    } 
} 

그리고 일반적인 방법 : 어쩌면 당신은 같은 당신의 논리를 다시 작성할 수 그 다음에 다음 요청.

40

PRG 패턴은 괜찮습니다,하지만 난이 한 :

자료 컨트롤러 :

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    if (TempData["ModelState"] != null && !ModelState.Equals(TempData["ModelState"])) 
     ModelState.Merge((ModelStateDictionary)TempData["ModelState"]); 

    base.OnActionExecuted(filterContext); 
} 

조치 (내가 xVal을 사용하고 있습니다) :

try 
{ 
    user.Login(); 
    AuthenticationManager.SignIn(user); 
} 
catch (RulesException rex) 
{ 
    // on bad login 
    rex.AddModelStateErrors(ModelState, "user"); 
    TempData["ModelState"] = ModelState; 
    return Redirect(Request.UrlReferrer.ToString()); 
} 

작업이 예외를 throw하고 ModelState를 TempData에 추가 한 다음 리퍼러로 다시 리디렉션합니다. 액션이 잡히므로 OnActionExecuted는 여전히 실행되지만 ModelState를 처음 사용할 때는 TempData [ "ModelState"]와 동일하므로 병합하지 않으려 고합니다. 리디렉션 동작이 실행되면 OnActionExecuted가 다시 발생합니다. 이번에는 TempData [ "ModelState"]에 아무 것도 없으면이 액션의 ModelState와 병합됩니다.

TempData [ "ModelState.user"] = ModelState를 사용하여 여러 모델로 확장 한 다음 ModelState로 시작하는 모든 TempData 개체를 병합 할 수 있습니다.

+0

나는 이것을 좋아합니다.이 일을 할 수있는 편리한 방법으로 보입니다. 고맙습니다! –

+2

@Bill. 나는 그것을 좋아한다. 내 용도에 맞게 코드를 확장했습니다. RulesException.AddModelStateErrors() 대신 다른 방법으로 ModelState를 두 가지 확장 메서드로 확장했습니다. UpdateModel 및 RestoreModel입니다. +1. – Syd

28

이 스레드는 오래된 것으로 알고 있지만 this blog about ASP.NET Best Practices에는 몇 가지 훌륭한 제안 사항이 있습니다.
# 13은 2 액션 필터를 사용하여 리디렉션간에 ModelState을 저장하고 복원하는 방법을 다룹니다.

이것은 내 작품에서 사용하는 패턴이며 나는 그것을 좋아합니다.내가 상관없이 내가 리디렉션 갈 곳 내 ModelState을 유지하지하기 위해 무슨 짓을

[ImportModelStateFromTempData] 
public ActionResult Dashboard() 
{ 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post), ExportModelStateToTempData] 
public ActionResult Dashboard(string data) 
{ 
    if (ValidateData(data)) 
    { 
     try 
     { 
      _service.Submit(data); 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError(ModelStateException, e); 
     } 
    } 

    return RedirectToAction("Dashboard"); 
} 
+1

질문 또는 답변의 나이는 실제로 중요하지 않습니다. 2014 년에도 도움을 줄 수 있습니다 .-- 링크에 대한 감사와 정말 좋은 물건! – Oliver

+0

** [ImportModelStateFromTempData] ** 및 ** [ExportModelStateToTempData] ** 속성도 여기에 설명되어 있습니다 : [ModelState를 좋은 연습에 따라 세션에 저장하는 방법] (http://patrickdesjardins.com/blog/how-to -save-the-modelstate-to-the-good-practice) – cat5dev

+1

링크 (내가 본 MVC에서 PRG의 모든 토론과 함께 유비쿼터스)는 이상하게 죽었습니다. Rashid의 전체 블로그가 ASP.NET 팀 블로그에서 삭제 된 것 같습니다. –

0

은 다음과 같다 :

가 여기에 간단한 예입니다 모델에서

  1. , 추가

    public ModelStateDictionary modelstate { get; set; } 
    
  2. 모델의 생성자에 다음을 추가하십시오.

    내 모델이라는 Models.ContactInformation와
    this.modelstate = new System.Web.Mvc.ModelStateDictionary(); 
    
  3. 샘플 포스트 : 그대로

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult contact(Models.ContactInformation con) 
    { 
        if (string.IsNullOrEmpty(con.SelectedAgencySelectorType)) 
        { 
        ModelState.AddModelError("", "You did not select an agency type."); 
        } 
    
        con.modelstate = ModelState; 
        TempData["contact"] = con; 
        if (!ModelState.IsValid) return RedirectToAction("contactinformation", "reports"); 
    
        //do stuff 
    
        return RedirectToAction("contactinformation", "reports"); 
    } 
    
  4. 그래서 지금 tempdata는 모델과 modelstate 있습니다.

  5. 다음은 무언가가있는 경우를 제외하고는 무엇이든지 상태에 대해 불가지론적인 내 견해입니다. 여기 코드는 다음과 같습니다

    [HttpGet] 
    public ActionResult contactinformation() 
    { 
        //try cast to model 
        var m = new Models.ContactInformation(); 
        if (TempData["contact"] is Models.ContactInformation) m = (Models.ContactInformation)TempData["contact"]; 
    
        //restore modelstate if needed 
        if (!m.modelstate.IsValid) 
        { 
         foreach (ModelState item in m.modelstate.Values) 
         { 
          foreach (ModelError err in item.Errors) 
          { 
           ModelState.AddModelError("", err.ErrorMessage.ToString()); 
          } 
         } 
        } 
    
        return View(m); 
    } 
    
관련 문제