2010-12-17 1 views
1

유창한 유효성 검사를 사용하여 뷰 모델의 유효성을 검사하려고합니다. viewmodel 객체를 게시 할 때 modelstate.isvalid는 항상 false를 반환합니다. 게시 된 개체의 값을 확인할 때 드롭 다운에 데이터를 표시하는 데 사용 된 속성의 유효성도 검사됩니다. 이 문제를 해결하는 방법. 내가 잘못하고있는 건가, pls 도움. 저는 ASP.net MVC를 처음 접했고이 프로젝트에서 유창한 유효성 검사와 유창한 NHibernate 매핑을 사용해 보았습니다.유창한 유효성 검사를 사용하여 뷰 모델의 유효성을 검사 할 때 문제가 발생했습니다.

자세한 내용은 다음과 같습니다 : I는 다음과 같이 뷰 모델을 만든

[Validator(typeof(TestRequirementValidator))] 
public class TestRequirement 
{ 
    public virtual int Id { get; private set; } 
    public virtual int SampleId { get; set; } 
    public virtual int TestId { get; set; } 
    public virtual int StandardId { get; set; }  
    public virtual string Description { get; set; } 
    public virtual Sample Sample { get; set; } 
    public virtual Test Test { get; set; } 
    public virtual Standard Standard { get; set; } 
} 

: 나는 다음과 같이 도메인 모델 객체가

[Validator(typeof(TestRequirementViewModelValidator))] 
public class TestRequirementViewModel 
{ 
    public TestRequirement TestRequirement; 
    public SelectList Samples; 
    public SelectList Tests; 
    public SelectList Standards; 

    public TestRequirementViewModel() 
    { 
    ISession _session = FNHsessionFactory.GetSessionFactory(); 
    this.TestRequirement = new TestRequirement(); 
    this.Samples = new SelectList(from S in _session.Linq<Sample>() select S, "Id", "Name"); 
    this.Tests = new SelectList(from T in _session.Linq<Test>() select T, "Id", "Name"); 
    this.Standards = new SelectList(from St in _session.Linq<Standard>() select St, "Id", "Name"); 
    } 
} 

모델 검사기는 다음과 같습니다 :

public class TestRequirementValidator : AbstractValidator<TestRequirement> 
{ 
    public TestRequirementValidator() 
    {  
    RuleFor(x => x.SampleId) 
    .NotEmpty() 
    .WithMessage("This field is required") 
    .DisplayName("Sample Name"); 

    RuleFor(x => x.TestId) 
     .DisplayName("Test Name"); 

    RuleFor(x => x.StandardId) 
     .NotEmpty() 
     .WithMessage("This field is required") 
     .DisplayName("Standard Name"); 

    RuleFor(x => x.Description) 
     .NotEmpty() 
     .WithMessage("This field is required")     
     .Length(0, 10) 
     .WithMessage("Length of this field cannot be more than 10 characters"); 
    } 
} 

보기 모델 검증은 다음과 같습니다 :

public class TestRequirementViewModelValidator:AbstractValidator-TestRequirementViewModel- 
{ 
    public TestRequirementViewModelValidator() 
    {    
    RuleFor(x => x.TestRequirement) 
     .SetValidator(new TestRequirementValidator()); 
    } 
} 

보기는 다음과 같습니다 :

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<foo.Models.ViewModels.TestRequirementViewModel>" MasterPageFile="~/Views/shared/site.master" %> 
<asp:Content ContentPlaceHolderID="MainContent" ID="MainContentContent" runat="server"> 
    <h3><%= Html.Encode(ViewData["Message"]) %></h3> 

    <% using (Html.BeginForm()) {%> 
    <%= Html.ValidationSummary(true) %> 
    <fieldset> 
     <legend>Create Test Requirement</legend> 

     <div class="editor-label"> 
     <%= Html.LabelFor(model => model.TestRequirement.SampleId) %> 
     </div> 

     <div class="editor-field"> 
     <%= Html.DropDownListFor(model => model.TestRequirement.SampleId, new SelectList(Model.Samples.Items, Model.Samples.DataValueField, Model.Samples.DataTextField), "Select Sample") %> 
     <%= Html.ValidationMessageFor(model => model.TestRequirement.SampleId) %> 
     </div> 

     <div class="editor-label"> 
     <%= Html.LabelFor(model => model.TestRequirement.TestId) %> 
     </div> 

     <div class="editor-field"> 
     <%= Html.DropDownListFor(model => model.TestRequirement.TestId, new SelectList(Model.Tests.Items, Model.Tests.DataValueField, Model.Tests.DataTextField), "Select Test") %> 
     <%= Html.ValidationMessageFor(model => model.TestRequirement.TestId) %> 
     </div> 

     <div class="editor-label"> 
     <%= Html.LabelFor(model => model.TestRequirement.StandardId) %> 
     </div> 

     <div class="editor-field"> 
     <%= Html.DropDownListFor(model => model.TestRequirement.StandardId, new SelectList(Model.Standards.Items, Model.Standards.DataValueField, Model.Standards.DataTextField), "Select Standard") %> 
     <%= Html.ValidationMessageFor(model => model.TestRequirement.StandardId) %> 
     </div> 

     <div class="editor-label"> 
     <%= Html.LabelFor(model => model.TestRequirement.Description) %> 
     </div> 

     <div class="editor-field"> 
     <%= Html.TextBoxFor(model => model.TestRequirement.Description) %> 
     <%= Html.ValidationMessageFor(model => model.TestRequirement.Description) %> 
     </div> 

     <p> 
     <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
    <% } %> 

    <%= Html.ClientSideValidation<TestRequirement>("TestRequirement") %> 
</asp:Content> 

컨트롤러는 다음과 같습니다 :

public ActionResult TestRequirement() 
{ 
    TestRequirementViewModel NewTestRequirement = new TestRequirementViewModel(); 
    return View(NewTestRequirement); 
} 

[HttpPost] 
public ActionResult TestRequirement(TestRequirementViewModel NewTestRequirement) 
{ 
    if(ModelState.IsValid) 
    { 
    ISession _session = FNHsessionFactory.GetSessionFactory();  
    _session.SaveOrUpdate(NewTestRequirement.TestRequirement);  

    ViewData["Message"] = "New Test Requirement has been created successfully"; 

    return View(); 
    } 

    return View(NewTestRequirement); 
} 

답변

0
내가 유창함 검증에 도움이되지 수

하지만, 같은 당신은 유창하네요 - nhibernate로 내가 당신의 NHibernate 사용법에 대해 언급해야한다고 생각 태그.

귀하의보기 모델은 생성자에서 NHibernate를 사용해서는 안됩니다. 실제로 뷰 모델은 외부 서비스에 의해 채워지는 데이터 구조 여야합니다. 마찬가지로, 컨트롤러에서도 똑같이 할 수 있습니다. 사람들이 컨트롤러를 분리하기 위해 데이터 액세스를 추출하기 위해 repository에 액세스하는 것이 일반적입니다. (테스트가 더 쉬워지면 테스트하지 않습니까?)

저장소를 사용하는 경우 엔티티에서보기 모델을 투영 할 수 있습니다. NHibernate projections and transformers을 사용하거나 AutoMapper과 같은 도구를 사용하여이 작업을 수행 할 수 있습니다.