2

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

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

因此,用户选择他是 GreenUser 还是 BlueUser。每种类型的用户都有不同的字段,并且根据用户选择的用户类型,我只想验证该特定类型用户的字段。如何做到这一点?

编辑:两个表单/模型必须在同一个视图上,也许有一些 JQuery 或 Partials?

4

3 回答 3

8

使用 创建一个表单,使用创建另一个表单,HtmlHelper<BlueUser>并将HtmlHelper<GreenUser>它们发布到不同的操作。

首先,视图模型是:

@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; }
   }
}
于 2012-06-24T18:03:18.033 回答
0

解决方案 1

你所做的是使用依赖验证,它不是默认内置的,只有Compare属性,你可以构建自己的属性,如果单选按钮值是必需的,或者你可以使用Mvc.ValidationTookit 之类的东西


解决方案 2

例如,当用户选择蓝色用户时,您使用 javascript 在表单提交事件中检查他根据他选择的内容选择了什么,您将引导他执行不同的操作,并将适当的模型作为参数传递

于 2012-06-24T17:03:44.037 回答
0

服务器端实现

  1. 您应该看到两个表格。

  2. 每个表格都应该在后期控制器中执行不同的操作。

动画的客户端实现

  1. 您可以使用任何您喜欢的 JavaScript 库来禁用一个表单,而另一个启用鼠标焦点。
于 2012-06-24T18:03:01.487 回答