Asp.net mvc 3 MVC3数据val-*属性未从模型编辑器模板发出
我已经为我当前的MVC3项目中的一个模型创建了一个编辑器模板。此模型正在为基础模式的属性调用正确的编辑器,但它们缺少用于验证的不引人注目的数据val-*属性 如何让MVC发出数据val属性 这是我的模型Asp.net mvc 3 MVC3数据val-*属性未从模型编辑器模板发出,asp.net-mvc-3,unobtrusive-validation,mvc-editor-templates,Asp.net Mvc 3,Unobtrusive Validation,Mvc Editor Templates,我已经为我当前的MVC3项目中的一个模型创建了一个编辑器模板。此模型正在为基础模式的属性调用正确的编辑器,但它们缺少用于验证的不引人注目的数据val-*属性 如何让MVC发出数据val属性 这是我的模型 [MetadataType(typeof(FieldTripRouteMetadata))] public partial class FieldTripRoute { private class FieldTripRouteMetadata { [Require
[MetadataType(typeof(FieldTripRouteMetadata))]
public partial class FieldTripRoute
{
private class FieldTripRouteMetadata
{
[Required]
[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime Date { get; set; }
[Required]
[DisplayName("Route")]
public int RouteID { get; set; }
[Required]
[DisplayName("Departure Time")]
[UIHint("TimeWithPeriod")]
[DisplayFormat(DataFormatString = "{0:h:mm tt}")]
public DateTime DepartureTime { get; set; }
[Required]
[StringLength(255)]
[DisplayName("Pickup Location")]
public String PickupLocation { get; set; }
[Required]
[StringLength(255)]
public String Destination { get; set; }
[Required]
[DisplayName("Arrival Time")]
[UIHint("TimeWithPeriod")]
[DisplayFormat(DataFormatString = "{0:h:mm t}")]
public DateTime ArrivalTime { get; set; }
public bool IsReturnRoute { get; set; }
public int FieldTripID { get; set; }
}
和我的编辑器模板:
@model FieldTripRoute
@{string routeType = (Model.IsReturnRoute ? "return" : "");}
<fieldset class="add@(routeType)Route" style="clear: both; width: 620px; margin-right: auto; margin-left: auto;">
<legend>Add Route</legend>
<div style="float: left; width: 275px;">
<div>
<div class="editor-label">@Html.LabelFor(model => model.Date)</div>
<div class="editor-field">@Html.EditorFor(model => model.Date)</div>
<div class="validation-error">@Html.ValidationMessageFor(model => model.Date)</div>
</div>
<div>
<div class="editor-label">@Html.LabelFor(model => model.DepartureTime)</div>
<div class="editor-field">@Html.EditorFor(model => model.DepartureTime)</div>
<div class="validation-error">@Html.ValidationMessageFor(model => model.DepartureTime)</div>
</div>
<div>
<div class="editor-label">@Html.LabelFor(model => model.ArrivalTime)</div>
<div class="editor-field">@Html.EditorFor(model => model.ArrivalTime)</div>
<div class="validation-error">@Html.ValidationMessageFor(model => model.ArrivalTime)</div>
</div>
</div>
<div style="float: left;">
<div>
<div class="editor-label">@Html.LabelFor(model => model.RouteID)</div>
<div class="editor-field">@Html.DropDownListFor(model => model.RouteID, Model.EditRouteList)</div>
<div class="validation-error">@Html.ValidationMessageFor(model => model.RouteID)</div>
</div>
<div>
<div class="editor-label">@Html.LabelFor(model => model.PickupLocation)</div>
<div class="editor-field">@Html.TextBoxFor(model => model.PickupLocation)</div>
<div class="validation-error">@Html.ValidationMessageFor(model => model.PickupLocation)</div>
</div>
<div>
<div class="editor-label">@Html.LabelFor(model => model.Destination)</div>
<div class="editor-field">@Html.EditorFor(model => model.Destination)</div>
<div class="validation-error">@Html.ValidationMessageFor(model => model.Destination)</div>
</div>
</div>
<div style="clear: both; width: 100px; margin: 20px auto 0 auto;">
<input type="button" id="submit@(routeType)Form" name="submit@(routeType)Form" value="Add" />
</div>
</fieldset>
我查看了所有的基本编辑器模板,它们都符合将名称保留为空字符串以允许MVC生成它的想法。但是我仍然没有验证。我能够通过在编辑器模板前后添加一个表单标记并添加
this.ViewContext.FormContext=new-FormContext()使其正常工作;
在编辑器模板的开头
当控件被传递到编辑器模板时,它似乎会丢失当前表单上下文。我尝试只添加ViewContext.FormContext命令,但如果不添加表单标记,嵌入模型将无法验证
所以现在我有一个表单在表单中,它按预期工作,但似乎应该有一个更简单的方法
formContext命令的想法来源于您是否检查了web配置?是的,这已经在网站的web.config中启用了。我能够解决这个问题。如果允许的话,我将发布一个完整的解释。如果您使用Html.BeginForm()。在内部,它将为您创建FormContext,而不是您手动声明它。问题是,在多个表单之间有多个表单是无效的html,因此我无法在嵌套的viewmodels周围放置表单,并且仍然有有效的html。
public class FieldTripEditViewModel
{
public FieldTrip Trip { get; set; }
public FieldTripRoute Route { get; set; }
public FieldTripRoute ReturnRoute { get; set; }
public FieldTripEditViewModel(){}
public FieldTripEditViewModel(FieldTrip trip)
{
this.Trip = trip;
this.Route = new FieldTripRoute();
this.ReturnRoute = new FieldTripRoute {IsReturnRoute = true};
}
}