Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 一个视图中有两个模型,仅验证其中一个_Asp.net Mvc_Asp.net Mvc 3_View_Model - Fatal编程技术网

Asp.net mvc 一个视图中有两个模型,仅验证其中一个

Asp.net mvc 一个视图中有两个模型,仅验证其中一个,asp.net-mvc,asp.net-mvc-3,view,model,Asp.net Mvc,Asp.net Mvc 3,View,Model,我有一个包含ParentModel的视图,它包含两个模型。 我只想验证其中一个的字段。不是两者都有。 假设我有: public ParentModel{ public BlueUser BlueUser {get; set;} public GreenUser GreenUser {get; set;} } 因此,用户选择他是绿色用户还是蓝色用户。每种类型的用户都有不同的字段,根据用户选择的用户类型,我只想验证特定类型用户上的字段。 如何做到这一点 编辑: 两个表单/模型必须位于同一视

我有一个包含ParentModel的视图,它包含两个模型。 我只想验证其中一个的字段。不是两者都有。 假设我有:

public ParentModel{
  public BlueUser BlueUser {get; set;}
  public GreenUser GreenUser {get; set;}
}
因此,用户选择他是绿色用户还是蓝色用户。每种类型的用户都有不同的字段,根据用户选择的用户类型,我只想验证特定类型用户上的字段。 如何做到这一点

编辑: 两个表单/模型必须位于同一视图上,可能带有一些JQuery或Partials?

解决方案1

您要做的是使用依赖项验证,默认情况下它不是内置的,只有
Compare
属性,您可以构建自己的属性,如单选按钮值是必需的,或者您可以使用


解决方案2


例如,当用户选择blue user时,您使用javascript在表单提交事件中检查他选择了什么取决于他选择了什么,您将引导他使用作为参数传递的适当模型执行不同的操作

  • 在视图中应该有两个窗体

  • 每个表单都应该在控制器上的post中执行不同的操作

  • 客户端动画实现

  • 您可以使用您喜欢的任何JavaScript库,使一个表单禁用,另一个启用鼠标焦点

  • 使用
    HtmlHelper
    创建一个表单,使用
    HtmlHelper
    创建另一个表单,并将它们发布到不同的操作

    首先,视图模型是:

    @model ParentModel
    
    然后使用
    HtmlHelperFor
    为每个子模型创建HtmlHelper:

    @{
       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()
    }
    
    最后,在控制器中,为每个窗体创建不同的POST操作:

    [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; }
       }
    }
    
    公共静态类HtmlHelperFactoryExtensions{
    公共静态HtmlHelper HtmlHelperFor(此HtmlHelper HtmlHelper){
    返回HtmlHelperFor(htmlHelper,默认值(TModel));
    }
    公共静态HtmlHelper HtmlHelperFor(此HtmlHelper HtmlHelper,TModel模型){
    返回HtmlHelpPerf(htmlHelper,model,null);
    }
    公共静态HtmlHelper HtmlHelperFor(此HtmlHelper HtmlHelper,TModel模型,字符串htmlFieldPrefix){
    var viewDataContainer=CreateViewDataContainer(htmlHelper.ViewData,模型);
    TemplateInfo TemplateInfo=viewDataContainer.ViewData.TemplateInfo;
    如果(!String.IsNullOrEmpty(htmlFieldPrefix))
    templateInfo.HtmlFieldPrefix=templateInfo.GetFullHtmlFieldName(HtmlFieldPrefix);
    ViewContext ViewContext=htmlHelper.ViewContext;
    ViewContext newViewContext=新的ViewContext(ViewContext.Controller.ControllerContext,ViewContext.View,viewDataContainer.ViewData,ViewContext.TempData,ViewContext.Writer);
    返回新的HtmlHelper(newViewContext、viewDataContainer、HtmlHelper.RouteCollection);
    }
    静态IViewDataContainer CreateViewDataContainer(ViewDataDictionary viewData,对象模型){
    var newViewData=新ViewDataDictionary(viewData){
    模型
    };
    newViewData.TemplateInfo=新的TemplateInfo{
    HtmlFieldPrefix=newViewData.TemplateInfo.HtmlFieldPrefix
    };
    返回新的ViewDataContainer{
    ViewData=newViewData
    };
    }
    类ViewDataContainer:IViewDataContainer{
    公共ViewDataDictionary ViewData{get;set;}
    }
    }
    
    您始终可以为适当类型的用户创建一个表单,但这两个表单必须位于同一视图上……这就是客户想要的,他们甚至向我提供了Illustrator布局。然后,也许您应该编辑您的问题并提供更多信息。谢谢您的回答Max,很高兴了解HtmlHelperFor类。遗憾的是,设计师给了我html标记,所以我不得不围绕它编码,也就是说,我不能将html代码分成两种形式。给我的布局相当混乱。我最终使用流体验证进行了个案验证。谢谢