2011-07-26 2 views
0

필수 입력란이 다르다는 점을 제외하면 두 가지 형식이 동일한 경우가 있습니다. 예를 들어 양식에 X, Y 및 Z와 같은 입력란이 있다고 가정 해 보겠습니다. 양식 # 1에서는 X가 필요하지만 양식 # 2에서는 Y가 필요합니다.ASP.NET MVC의 다형성 및 강력한 형식의 뷰 MVC

그래서 두 개의보기 모델 인 Form1과 Form2를 동일한 속성으로 만들었지 만 다른 속성의 필수 속성으로 만들었습니다. 그런 다음 인터페이스를 만들고 IForm이라고 부르 자. 두 모델 모두 IForm에 강력한 형식의 뷰를 구현하고 작성했습니다.

이 솔루션의 문제점은 ASP.NET MVC 3이보기에 전달되는 개체의 동적 형식 (Form1 또는 Form2) 대신 IForm에서 특성을 읽음으로써 클라이언트 측을 얻지 못한다는 점입니다 내가 원하는 JavaScript 필드 유효성 검사.

각보기 모델에 강력한 형식의보기를 만드는 것 이외의 다른 해결책이 있는지 궁금합니다.

답변

2

난 당신이 (내가 생각하는) 기술 된 것과 함께 샘플을 넣어 가지고 내가 그것을 작동시킬 수있어 :

@model Test.Controllers.IFoo 

<h2>Test</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>IFoo</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Description) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Description) 
      @Html.ValidationMessageFor(model => model.Description) 
     </div> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 
:

public class TestController : Controller 
{ 
    public ActionResult Foo() 
    { 
     return View("IFoo"); 
    } 

    [HttpPost] 
    public ActionResult Foo(Foo foo) 
    { 
     if (!ModelState.IsValid) 
      return View("IFoo", foo); 

     return RedirectToAction("Foo"); 
    } 

    public ActionResult Bar() 
    { 
     return View("IFoo"); 
    } 

    [HttpPost] 
    public ActionResult Bar(Bar bar) 
    { 
     if (!ModelState.IsValid) 
      return View("IFoo", bar); 

     return RedirectToAction("Bar"); 
    } 
} 

// The Interface - the Required attributes are not 
// on the interface, just the concrete classes 
public interface IFoo 
{ 
    string Name { get; set; } 
    string Description { get; set; } 
} 

// Concrete Class 1 - Name is required 
public class Foo : IFoo 
{ 
    [Required(ErrorMessage="Name is required.")] 
    public string Name { get; set; } 

    public string Description { get; set; } 
} 

// Concrete Class 2 - Description is required 
public class Bar : IFoo 
{ 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Description is required.")] 
    public string Description { get; set; } 
} 

내가 다음 강력한 형식의 뷰를 정의

/test/foo를 탐색하여 저장을 누르면 이름에 대한 유효성 검사 오류가 발생합니다.

/test/bar를 탐색하여 저장을 누르면 설명에 대한 유효성 검사 오류가 발생합니다.

+0

정확합니다. 유효성 검사는 서버 측에서 작동합니다. 그러나 jQuery 클라이언트 측 유효성 검사는 작동하지 않으며 간단한 해결책이있는 것처럼 보이지 않으므로 응답으로 표시하고 있습니다. – Michael

관련 문제