2012-12-18 2 views
2

동일한 viewModel에서 편집 가능/읽기 전용 필드를 처리하는 가장 좋은 방법은 무엇일까 궁금합니다. 나는 더 큰 뷰 모델이 문제에 직면하지만이 전 매우 간단한 뷰 모델이 가정하자 해요 :편집 가능한 및 읽기 전용 데이터 모범 사례가있는 MVC ViewModel

public class BaseListViewModel 
{ 
    public int Id { get; set; } 
    public bool IsCheckedForAction { get; set; } 
    public string DisplayName { get; set; } 
} 

내 PartialView : 나는 내 데이터를 게시 할 때

분명히
@model Wims.Website.ViewModels.Shared.BaseModelListViewModel 
@using Wims.Website.Classes.Helpers.ExtentionMethods 
<div class="dataDetail"> 
     <div> 
      <div class="float-left"> 
       @Html.CheckBoxFor(model => model.IsCheckedForAction) 
      </div> 

      <div class="float-left"> 
       @Html.LabelFor(model => model.IsCheckedForAction, Model.DisplayName) 


       @Html.GenerateSecureDataControls(w => w.Id) 
      </div> 
     </div> 
    </div> 
<div style="clear: both"></div> 

, 표시 이름이되지 않습니다를 채우는. 일부 유효성 검사가 실패했다고 가정하고 DisplayName이 누락 된 데이터를 반환합니다.

[HttpPost] 

public ActionResult Edit(BaseListViewModel stuff) 
{ 
    if (ModelState.IsValid) 
    { 
     ... 
     return View("Index"); 
    } 
    return View(stuff); 
} 

내가 아는이이 문제를 해결하는 몇 가지 방법입니다 경우 발생하는, 그냥 1 필드의 경우

1) 괜찮 뷰에

@Html.HiddenFor(model => model.DisplayName) 

를 추가,하지만 난 10 개의 표시 전용 필드가 있습니까?

2) [HttpPost]에서 (! Model.isValid) if requery data.

3) 내가 TempData에서 캐시 할 수있을 것 같습니까?

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 감사합니다.

편집 : 나는 유효성 검사가

답변

3

나는 PRG 패턴을 사용하십시오 실패하면 데이터를 다시 쿼리하는 것을 피하기 위해 노력하고 있어요. GET 액션에서 ViewModel 만 빌드하면 더 건조합니다. 유효성 검사가 실패하면 GET으로 리디렉션하고 모델 상태를 tempdata에서 가져옵니다.

이 문서, http://www.jefclaes.be/2012/06/persisting-model-state-when-using-prg.html에서의 속성, 또는 MVC있는 contrib https://github.com/mvccontrib/MvcContrib/blob/master/src/MVCContrib/Filters/ModelStateToTempDataAttribute.cs에서, 그것은 쉽게 POST 사이의 Modelstate을 통과 할 수 있도록하고 사후 조치가 GET으로 뷰 모델의 동일한 초기화를 수행해야합니다

+0

안녕하세요, 답변을 주셔서 감사합니다. 이러한 게시물이 내 ViewModel Readyonly 데이터를 채우는 데 어떻게 도움이되는지 이해할 수 없습니까? 내가 다른 상태로 보내려면 modelState 오류를 유지할 수 있음을 이해합니다. 내 질문에 게시되지 않은 데이터를 내 ViewModel에 유지하는 것이 더 중요합니까? – Tom

+0

왜? GET 작업에서 ViewModel을 한 번 만듭니다. theGET의 [RestoreModelStateFromTempData] 속성에서 복원을 넣습니다. POST에 [SetTempDataModelState]를 입력하십시오. 그런 다음 ModelState 유효성 검사가 실패하면 다시 GET으로 리디렉션됩니다. 새로운 ViewModel을 만들고 나서 제출 된 데이터와 유효성 검사 오류를 병합합니다 – GraemeMiller

+0

안녕하세요, 포기하지 마시고 고마워요 :) 당신이 말하는 것을 이해하고 있다고 생각하지만 피하려고하는 것은 데이터베이스로 돌아갑니다 (그리고 예, 나는 두 번째 GET에서 다시 언급하지 않았습니다.) 내가 뭘 할 수 있고, 어쩌면 그것은 (느린 것에 대해 유감스럽게 생각한다면 :)) 당신이 방금 쓴 것을하고, 첫 번째 Get 후에 TempData에 전체 ViewModel을 추가하고, PRG 패턴에서 TempData를 가져온다. 다시 고마워 – Tom

0

GET 동작. 초기화 코드를 컨트롤러의 공통 개인 함수로 옮길 수 있습니다. 동일한 데이터에 대한 동시 변경으로 인해 유효성 검사가 실패하면 유효성 검사 오류가 새 데이터와 함께 사용자에게 표시됩니다. 보기에서 허용하는 경우 PRG 패턴을 사용할 수도 있습니다.

관련 문제