1

現在のMVC3プロジェクトで自分のモデルのエディターテンプレートを作成しました。このモデルでは、基礎となるモードのプロパティに対して正しいエディタを呼び出していますが、検証のために控えめなdata-val- *属性がありません。モデルエディターテンプレートから出力されないMVC3 data-val- *属性

MVCにデータval属性を発行させるにはどうすればよいですか?エディタのテンプレートが対応

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を見て、私のベースのすべて:

@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> 

そして、私のViewModel:

は、ここに私のモデル

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

と私のエディタのテンプレートです名前を空の文字列として残してMVCがそれを生成できるようにするアイデア。しかし、私はまだ検証がありません。

+0

から来たあなたは、あなたの のためのWeb構成をチェックしなかった <キー=値= "真"/"ClientValidationEnabled" を追加>を<「=キー= "UnobtrusiveJavaScriptEnabled" 値を追加true "/> ? – torm

+0

はい、サイトのweb.configですでに有効になっています。 – Philter

+0

私は[この投稿](http://stackoverflow.com/questions/6657641/asp-net-mvc-3-client-validation-attributes-generation)で解決することができました私を許可します。 – Philter

答えて

3

エディタテンプレートの前と後にフォームタグを追加し、エディタテンプレートの冒頭にthis.ViewContext.FormContext = new FormContext(); を追加することで、機能させることができました。

コントロールがエディタテンプレートに渡されると、現在のフォームコンテキストが失われているように見えます。私は、ViewContext.FormContextコマンドを追加しようとしましたが、埋め込みモデルが検証されないフォームタグを追加しませんでした。

今私はフォームの中にフォームがあり、それは意図した通りに動作しますが、より簡単な方法があるようです。

formContextコマンドのアイデアはhere

+0

Html.BeginForm()を使用した方が簡単でした。内部的には、手動で宣言するのではなく、FormContextを作成します。 –

+0

それは、複数のフォームを互いに有効にするのは有効なhtmlではないため、入れ子になったビューモデルの周りにフォームを配置できず、有効なHTMLが残っています。 – Philter

関連する問題