2014-05-15 2 views
1

여러 ViewModels로보기의 유효성 검사에 문제가 있습니다. 제 상황은 하나의 기본 양식이 있는데, 이는 많은 페이지에서 동일합니다. ID 매개 변수를 사용하여이 기본 양식에 새 외부 필드를 렌더링합니다. 이러한 외부 필드는 자체 ViewModel과 자체 Controller를 사용하는 ActionResult 유형입니다. 주 작업 컨트롤러에서 ModelState.IsValid 경우 제어 할 수 있지만 문제가 - 모든 외부 필드의 모든 ViewModels 유효성을 검사하지만 활성 외부 필드 및 기본 폼 너무 ViewModel 만 유효성을 검사 할 너무 싶습니다.ModelState.IsValid를 사용하여 단일 뷰에서 여러 ViewModels의 유효성을 검사하는 방법

그것은 다음과 같습니다

의 ViewModel을 내가 필요하면 내가 (AllFieldsVm의 새로운 인스턴스를 생성하고이에 ExternalFieldXyVm의 새 인스턴스를 만들

외부 필드의 컨트롤러에서
public class AllFieldsVm 
{ 
    public BasicFormVm BasicFormVm { get; set; } 
    public ExternalFieldXyVm ExternalFieldXyVm { get; set; } 
    public AnotherExternalFieldVm AnotherExternalFieldVm { get; set; } 
} 

모든 뷰 모델로, I 이 필드를 미리 채 웁니다). 이것은 일부 조건이 참일 때 부분 뷰 (@{Html.RenderAction("Action", "Controller", new {@someOptionalData = value});} 사용)와 같은 화이트 아웃 레이아웃을 렌더링합니다.

사후 조치에 대한 기본 형태의 컨트롤러에서

나는 이런 식으로 뭔가를하고 난이 코드 if (ModelState.IsValid(model.BasicFormVm) && ModelState.IsValid(model.ExternalFieldXyVm)) 같은 것을 사용하려면 :

[POST("someurl-id{someId}")] 
public ActionResult SaveFormData(int someId, AllFieldsVm model) 
{ 
    //Here I want something like 
    //if (ModelState.IsValid(model.BasicFormVm) && ModelState.IsValid(model.ExternalFieldXyVm)) or something like that... 

    var se = new SomeEntity(); 
    se.property1 = model.property1; 
    se.property2 = model.property2; 

    using (var dbc = _db.Database.BeginTransaction()) 
    { 
     try 
     { 
      _db.Add(se); 
      _db.SaveChanges(); 

      //My Condition - when save external data 
      if (someId == (int) MovementTypes.SomeEnumInt) 
      { 
       var rd = new ExternalFieldEntity 
        { 
         PropertyA = se.property0, 
         PropertyB = Convert.ToDateTime(model.ExternalFieldXyVm.SomeExternalFieldName) 
        }; 

       _db.Add(rd); 
       _db.SaveChanges(); 
      } 

      dbc.Commit(); 
     } 
     catch (Exception) 
     { 
      dbc.Rollback(); 
     } 
    } 

    return RedirectToAction("Action", "Controller"); 
} 

그래서, 내 질문은, 어떻게 ExternalFieldXyVm 유효성을 검사 할 수 있습니다 separatly 기반 어떤 조건에?

기본 DataAnnotations 또는 FluentValidation을 사용하지 않고 모든 자체 유효성 검사기를 만들어야합니까? 이런 형식의 경험이 없으니 잠시 기다려주십시오 ...

모두에게 감사드립니다 !!

+0

가능한 복제 http://stackoverflow.com/questions/1135320/validation-on-viewmodels-in-asp-net-mvc –

+0

Simranjeet : 아니요, 그렇지 않습니다. 복제. 나는 viewmodel에서 원하는 속성을 검증하는 방법을 안다. 하나의 ViewModel이 컨트롤러에서 유효성을 검사 할 컨트롤을 원합니다. 이 욕망은 어떤 상태의 결과에 근거해야합니다. 만약 내가 ModelState.IsValid 페이지의 여러 Vms의 구체적인 Vm (및 컨트롤러의 한 POST 동작에서) ModelState.IsValid를 사용할 수 있는지, 또는 알지 못한다면 어떻게해야합니까? – goldJ

+1

ModelState.IsValid wouldn ' 도와 줘. 그것은 특정 것이 아닌 모든 것을 검증 할 것입니다. –

답변

1

위대한, 알겠습니다. 나는 이틀 동안 이걸 가지고 놀고, 내가 그것을 보지 못했을 가능성이 있는지 모른다.

결과 : 기본 viewmodel에 포함 된 자체보기 모델이있는보기가보기로 렌더링되지 않으면이보기 모델은 게시 작업에서 유효성을 검사하지 않습니다. 그래서 내 기본 양식은 항상 유효성을 검사하고 ExternalFields는 렌더링 될 때만 유효성을 검사합니다. 죄송합니다. 바보 같은 질문에 대해 ...

+0

ModelState를 사용하지 않도록 코드를 제공 할 수 있습니까? 나는 똑같은 문제가있어서 당신의 대답을 이해하지 못합니다. – Richard

+0

코드에서 컨트롤러를 변경하고, 일부 뷰 모델에있는 것을 저장하려고 할 때 - model.ViewModel1! = null 및 다른 조건이나 매개 변수가 있으면이를 변경하십시오. model.Viewmodel2! = null this ... 이러한 뷰 모델의 유효성 검사를 위해 FluentValidation을 사용하므로 컨트롤러에서 post 작업을 호출하기 전에 유효성 검사 프로세스가 만들어집니다. – goldJ

관련 문제