2012-04-04 2 views
0

MVC 4 및 MVC Futures [Serializable] 기능을 사용하여 다중 단계 마법사를 통해 데이터를 유지합니다. 마법사 자체는 사용자로부터 정보를 수집 한 다음 해당 입력을 기반으로 자동 응답을 생성합니다. 나는 입력을 DB에 영구 저장할 필요가 없다.페이지를 새로 고침하면 입력이 재설정됩니다.이를 피할 수 있습니까?

지금은 마법사의 확인 페이지에서 처리 할 수있는 문제가 조금 있지만 문제를 해결할 수 있는지 궁금합니다. 내 문제는 특정 단계에서 사용자가 "새로 고침/F5"를 눌렀을 때 모든 입력이 삭제되고 모든 이전 단계가 지워진다는 것입니다. 그들이 확인하기 전에 마지막 단계에 있다면 그들은 그들이 이전 단계에서 입력 한 모든 것을 지웠다는 것을 깨닫지 못할 것입니다. 이를 처리하는 방법은 확인 페이지에 유효성 검사 요약을 넣는 것으로 모든 입력을 다시해야한다는 것을 보여줍니다. 이는 사용자 경험을 파괴하기 때문에 (즉, 모든 단계를 거쳐 다시 입력해야하기 때문에) 문제가됩니다. 여기

내 컨트롤러 코드의 샘플입니다 : 페이지를 새로 고침을 포함한 어제 대부분을 연구 한

//This is the serialization: 
private MyData myData; 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var serialized = Request.Form["myData"]; 
     if (serialized != null) //Form was posted containing serialized data 
     { 
      myData = (MyData)new MvcSerializer().Deserialize(serialized, SerializationMode.Signed); 
      TryUpdateModel(myData); 
     } 
     else 
      myData = (MyData)TempData["myData"] ?? new MyData(); 
    } 
    protected override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     if (filterContext.Result is RedirectToRouteResult) 
      TempData["myData"] = myData; 
    } 
... 
//This shows a mid-step in the wizard - only as an example: 
public ActionResult Step2(string backButton, string nextButton) 
{ 
    if (backButton != null) 
     return RedirectToAction("Step1"); 
    else if ((nextButton != null) && ModelState.IsValid) 
     return RedirectToAction("Step3"); 
    else 
     return View("Step2", myData); 

[Serializable], TempData, Session, OutputCache 관련된 다양한 일에 오늘 아침에 등을들 수 있으며, 데이터는 지속되지만 지점에서 아무 것도 찾을 수 없습니다.

return 호출에서 의미가있는 유일한 것은 ActionResult의 모든 것 이후에 발생합니다. 그게 중요한지는 모르겠지만, 페이지 새로 고침으로 인해 모델이 끝날 때까지 치지 않기 때문에이 상황에서 입력 된 모든 데이터가 사라질 수 있습니다. 그러나 문제가 있다면 이미 가지고있는 코드를 깨지 않고 해결하는 방법을 알 수 없습니다.

나는 어떤 지침을 주셔서 감사합니다.

P. MVC 4 태그가 없으므로 MVC 3을 선택했습니다.

답변

0

문제는 TempData에서 발생합니다. 귀하의 경우에는 리디렉션 하나의 요청에 대해서만 내부에 저장된 데이터가 살아납니다.

첫 번째 가능성은 TempData에서 이상 데이터를 유지하는 것입니다 : 좀 더 세션에 동화

... 
else 
{ 
    myData = (MyData)TempData["myData"] ?? new MyData(); 
    TempData.Keep(); 
} 

. 따라서 TempData 대신 Session을 사용할 수 있습니다.

다른 해결책은 데이터베이스의 일부 임시 테이블에 각 단계의 데이터를 저장하여 각 단계에서 데이터베이스를 검색 할 수 있도록하는 것입니다. 나는 당신이 모든 단계에서이 문제를 가지고 있다고 생각합니다. 요약을 보여줄 마지막 질문뿐만 아니라. 어쨌든 마지막 단계에 대해서만 염려한다면 어쨌든 데이터를 데이터베이스에 저장하지 않으시겠습니까?

+0

이렇게했습니다. 호기심, 나는 그것을 OnResultExecuted에 두는 것을 시도하고 잘 작동한다. 마지막 질문에 대한 짧은 대답 : 저는 프로그래머가 아닙니다. 긴 답변 : 단계를 거쳐야 만 최종 결과가 사용자의 선택에 따라 자동으로 응답됩니다 (계산 된 합계 또는 상황에 대한 일반적인 평가). 나는이 시나리오가 아닌 다른 시나리오에서 데이터를 유지하려고합니다. – REMESQ

관련 문제