1

我在当前的MVC3项目中为我的某个模型创建了编辑器模板。该模型为底层模式的属性调用了正确的编辑器,但它们缺少用于验证的不显眼数据val- *属性。未从模型编辑器模板发出的MVC3数据val- *属性

我怎样才能让MVC发出data-val属性?

这里是我的模型

[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="[email protected](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="[email protected](routeType)Form" name="[email protected](routeType)Form" value="Add" /> 
    </div> 
</fieldset> 

我的视图模型:

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}; 
    } 
} 

我看着this post和我所有的基地的编辑模板对应于将该名称留为空字符串以允许MVC生成它的想法。但我仍然没有确认。

+0

你检查你的web配置为 <添加键= “ClientValidationEnabled” 值= “真”/> <添加键= “UnobtrusiveJavaScriptEnabled” 值=” true“/> ? – torm 2012-02-13 17:17:22

+0

是的,这已经在web.config中为该站点启用了。 – Philter 2012-02-13 17:38:07

+0

我能解决它与[这篇文章](http://stackoverflow.com/questions/6657641/asp-net-mvc-3-client-validation-attributes-generation)我会发布一个完整的解释,当SO允许我。 – Philter 2012-02-13 17:43:01

回答

3

我可以通过在我的编辑器模板前后添加表单标签并在编辑器模板的开头添加this.ViewContext.FormContext = new FormContext(); 来使其运行。

看来,当控件传递给编辑器模板时,它会丢失当前的表单上下文。我试着只是在ViewContext.FormContext命令中加入,但没有添加嵌入式模型不会验证的表单标签。

所以现在我有一个窗体里面的形式,它的工作原理,但它似乎应该有一个更简单的方法。

为formContext命令的想法来自here

+0

如果使用Html.BeginForm()会更容易。在内部它会为你创建FormContext,而不是你手动声明它。 – 2012-02-17 13:56:54

+0

问题在于它不是有效的html,它们之间有多个表单,因此我无法在嵌套视图模型周围放置一个表单并仍然有有效的HTML。 – Philter 2012-02-21 13:52:18

相关问题