我有一个包含ParentModel的View,其中包含2个Models。 我只想验证其中一个或另一个的字段。不是都。 我们说我有:
public ParentModel{
public BlueUser BlueUser {get; set;}
public GreenUser GreenUser {get; set;}
}
因此用户选择他是GreenUser或BlueUser。每种类型的用户都有不同的字段,并且根据用户选择的用户类型,我只想验证该特定类型用户的字段。 怎么能实现这一目标?
编辑: 两种形式/模型必须位于同一个视图中,可能包含一些JQuery或Partials?
答案 0 :(得分: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; }
}
}
答案 1 :(得分:0)
解决方案1
你所做的是使用依赖性验证,它默认不是内置的,只有Compare
属性,你可以构建自己的属性,如果单选按钮值是必需的,或者你可以使用像{{{{ 3}}
解决方案2
当用户选择蓝色用户时,例如你使用javascript检查表单提交事件他根据自己的选择选择了什么,你将指导他使用作为参数传递的适当模型的不同操作
答案 2 :(得分:0)
服务器端实施
您应该在视图中有两个表单。
每个表单都应该在post上的控制器中执行不同的操作。
动画的客户端实施