2012-06-24 2 views
2

2 개의 모델이 포함 된 ParentModel이 포함 된 뷰가 있습니다. 하나만 다른 필드의 유효성을 검사하려고합니다. 둘 다 아닙니다. Let's 내가 가진 말 :두 모델이 하나의 뷰에 있고 그 중 하나만 유효성 확인

public ParentModel{ 
    public BlueUser BlueUser {get; set;} 
    public GreenUser GreenUser {get; set;} 
} 

그래서 사용자는 하나 그가 GreenUser 또는 BlueUser입니다 선택합니다. 각 유형의 사용자는 서로 다른 필드를 가지며 사용자가 어떤 유형의 사용자를 선택 하느냐에 따라 해당 특정 유형의 사용자의 필드 만 유효성을 확인하려고합니다. 어떻게이 작업을 수행 할 수 있습니까?

EDIT : 두 양식/모델이 동일한보기에 있어야하며 일부 JQuery 또는 Partials가 있어야합니까?

+0

당신은 언제나 사용자 – YavgenyP

+0

의 적절한 유형의 양식을 구축 할 수 있습니다하지만이 개 형태가 동일한 뷰에있을 ... 클라이언트가 원하는 방법 것은 이것이 가지고 있고 심지어 일러스트 레이터로 날을 제공 레이아웃. – Benjamin

+0

그러면 질문을 수정하고 자세한 정보를 제공해야합니다. – YavgenyP

답변

8

HtmlHelper<BlueUser>과 다른 하나는 HtmlHelper<GreenUser>으로 만들고 다른 동작에 게시하십시오.

먼저, 뷰 모델이다

@model ParentModel 

이어서 서브 모델의 각각에 대한 html 헬퍼를 만들 HtmlHelperFor을 사용

@{ 
    var blueHtml = Html.HtmlHelperFor(Model.BlueUser); 
    var greenHtml = Html.HtmlHelperFor(Model.GreenUser); 
} 

@using (blueHtml.BeginForm("BluePost", null)) { 
    @blueHtml.EditorForModel() 
} 

@using (greenHtml.BeginForm("GreenPost", null)) { 
    @greenHtml.EditorForModel() 
} 

마지막으로, 제어부에서 각하는 가지 다른 포스트 액션을 만들 양식 :

[HttpPost] 
public ActionResult BluePost(BlueUser model) { 
    ... 
} 

[HttpPost] 
public ActionResult GreenPost(GreenUser model) { 
    ... 
} 

확장 방법은 다음과 같습니다.

public static class HtmlHelperFactoryExtensions { 

    public static HtmlHelper<TModel> HtmlHelperFor<TModel>(this HtmlHelper htmlHelper) { 
     return HtmlHelperFor(htmlHelper, default(TModel)); 
    } 

    public static HtmlHelper<TModel> HtmlHelperFor<TModel>(this HtmlHelper htmlHelper, TModel model) { 
     return HtmlHelperFor(htmlHelper, model, null); 
    } 

    public static HtmlHelper<TModel> HtmlHelperFor<TModel>(this HtmlHelper htmlHelper, TModel model, string htmlFieldPrefix) { 

     var viewDataContainer = CreateViewDataContainer(htmlHelper.ViewData, model); 

     TemplateInfo templateInfo = viewDataContainer.ViewData.TemplateInfo; 

     if (!String.IsNullOrEmpty(htmlFieldPrefix)) 
     templateInfo.HtmlFieldPrefix = templateInfo.GetFullHtmlFieldName(htmlFieldPrefix); 

     ViewContext viewContext = htmlHelper.ViewContext; 
     ViewContext newViewContext = new ViewContext(viewContext.Controller.ControllerContext, viewContext.View, viewDataContainer.ViewData, viewContext.TempData, viewContext.Writer); 

     return new HtmlHelper<TModel>(newViewContext, viewDataContainer, htmlHelper.RouteCollection); 
    } 

    static IViewDataContainer CreateViewDataContainer(ViewDataDictionary viewData, object model) { 

     var newViewData = new ViewDataDictionary(viewData) { 
     Model = model 
     }; 

     newViewData.TemplateInfo = new TemplateInfo { 
     HtmlFieldPrefix = newViewData.TemplateInfo.HtmlFieldPrefix 
     }; 

     return new ViewDataContainer { 
     ViewData = newViewData 
     }; 
    } 

    class ViewDataContainer : IViewDataContainer { 

     public ViewDataDictionary ViewData { get; set; } 
    } 
} 
+0

답변 해 주셔서 감사합니다. Max, HtmlHelperFor 클래스에 대해 알아두면 좋습니다. 안타깝게도 디자이너가 HTML 마크 업을 제공하여 코드를 작성해야 했으므로 HTML 코드를 두 가지 형식으로 구분할 수 없습니다. 내가받은 레이아웃은 상당히 엉망입니다. 최종적으로 유체 검증을 사용하여 케이스 별 검증을 수행했습니다. 감사! – Benjamin

0

솔루션 1

은 당신이하는 일은 필요 같은 라디오 버튼 값이 무언가이었다 또는 당신이 뭔가를 사용할 수있는 경우 사용 종속성 유효성 검사가 기본적으로 내장하지 자사 만 Compare 속성, 당신은 당신의 자신의 속성을 구축 할 수있다 같은 Mvc.ValidationTookit


솔루션이

사용자가 당신은 그가 따라 선택 했 어떤 이벤트를 제출 형태로 확인하기 위해 자바 스크립트를 사용하여 예를 들어 파란색 사용자 선택 그는 당신이 매개 변수로 전달 적절한 모델

0

서버 측 구현

  1. 와 다른 작업에 그를 직접 것입니다 무엇을 선택에 당신이보기에 두 가지 형태를 가져야한다.

  2. 각 양식은 게시물에서 컨트롤러의 다른 작업으로 이동해야합니다. 애니메이션

    1. 에 대한

    클라이언트 측 구현 당신은 유 한 형태의 비활성화를 만들기 위해 원하는대로 자바 스크립트 라이브러리를 사용할 수 있으며, 다른 하나는 마우스 초점 수 있습니다.

관련 문제