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