アプリケーションにベンダーのリストを表示するインデックスビューがあります。また、そのページに新しいアイテムを追加するための小さなフォームを追加したいと思います。作成フォームは作成アクションに投稿されます。私のモデルクラスには、ベンダーのリストに加えて、NewVendorという名前の単一ベンダーの1つのプロパティが含まれています。
public IEnumerable<SoftwareVendor> Vendors { get; set; }
public SoftwareVendor NewVendor { get; set; }
クラスにはSoftwareVendor
検証属性があります。これはEntityFrameworkクラスです。
作成アクションに投稿するフォームの作成は簡単です。
@using (Html.BeginForm( "Create", "Vendor" )) {
@Html.ValidationSummary(true)
<fieldset>
<legend>New Software Vendor</legend>
<div class="editor-label">
@Html.LabelFor(model => model.NewVendor.Name)
</div>
<div class="editor-field">
@Html.EditorFor( model => model.NewVendor.Name )
@Html.ValidationMessageFor( model => model.NewVendor.Name )
</div>
<br />
<input type="submit" value="Create" />
</fieldset>
}
この投稿は問題なく、クライアント側の検証も機能します。ただし、デフォルトの作成アクションはのインスタンスを取り、SoftwareVendor
「名前」と呼ばれるフォームコレクション内のキーを探しています。代わりに、上記のフォームは「NewVendor.Name」を投稿します。
でテンプレートとフィールド名を指定することで、これを修正でき@Html.EditorFor
ます。
@Html.EditorFor( model => model.NewVendor.Name, "string", "Name" )
これで、「名前」の値が受信されているため、作成アクションは満足のいくものになります。ただし、「NewVendor.Name」という名前のフィールドをまだ検索しているため、検証メッセージは壊れており、これをオーバーライドする方法はないようです。
<span class="field-validation-valid" data-valmsg-for="NewVendor.Name" data-valmsg-replace="true"></span>
これを機能させるために私が見逃している簡単なものはありますか?
これを解決するために私ができることのリストは次のとおりです。
- 作成アクションで、SoftwareVendorではなくインデックスモデルのインスタンスを取得します。ただし、従来の作成ビューはまだありますが、これは実行したくありません。
- 作成アクションにパラメータをとらせないでください。代わりに、フォームキーを手動で確認し、「Name」または「NewVendor.Name」のどちらか一方から名前を取得します。
- 作成アクションで両方のモデルクラスを取得し、どちらが適切に設定されたかを検出します。これは#2によく似ていますが、フォームコレクションをチェックする代わりに、null以外の値のプロパティをチェックしています。
- #2が行っていることを実行するモデルバインダーを作成する方法を理解します。これは非常に複雑に思えます。この問題は多くのページで発生するため、もっと簡単な方法を望んでいます。
- フォーム送信の代わりにjavascriptを使用して投稿を行うと、投稿する正確なフィールド名を制御できます。これは機能しますが、HTMLフォームを利用したいのですが、それが目的だからです。
- のオーバーロードを使用し
EditorFor
てフィールド名を指定し、検証メッセージを手動で作成します。 - フィールド名をオーバーライドできる
HtmlHelper
新しいもののために、独自の拡張メソッドを記述します。ValidationMessageFor
これらのオプションのうち、#2または#5は、より良い方法がない限り、私が選択すると思うものです。