Asp.net mvc 一个视图中有两个模型,仅验证其中一个
我有一个包含ParentModel的视图,它包含两个模型。 我只想验证其中一个的字段。不是两者都有。 假设我有: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;} } 因此,用户选择他是绿色用户还是蓝色用户。每种类型的用户都有不同的字段,根据用户选择的用户类型,我只想验证特定类型用户上的字段。 如何做到这一点 编辑: 两个表单/模型必须位于同一视
public ParentModel{
public BlueUser BlueUser {get; set;}
public GreenUser GreenUser {get; set;}
}
因此,用户选择他是绿色用户还是蓝色用户。每种类型的用户都有不同的字段,根据用户选择的用户类型,我只想验证特定类型用户上的字段。
如何做到这一点
编辑:
两个表单/模型必须位于同一视图上,可能带有一些JQuery或Partials?解决方案1
您要做的是使用依赖项验证,默认情况下它不是内置的,只有Compare
属性,您可以构建自己的属性,如单选按钮值是必需的,或者您可以使用
解决方案2
例如,当用户选择blue user时,您使用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代码分成两种形式。给我的布局相当混乱。我最终使用流体验证进行了个案验证。谢谢