Html.HiddenForの適切な定義はMSDNで見つけることができますが、Html.Hiddenで見つけることができるのはそれが抱えている問題に関連しているだけです。
誰かが良い定義と例を教えてもらえますか。
ほとんどのMVCヘルパーメソッドには、XXXForバリアントがあります。これらは、具体的なモデルクラスと組み合わせて使用することを目的としています。アイデアは、ヘルパーがラムダで指定したプロパティに基づいてフォーム入力コントロールの適切な「名前」属性を導出できるようにすることです。これは、モデルプロパティをビューと相関させるために使用する必要のある「マジックストリング」を削除できることを意味します。例えば:
Html.Hidden("Name", "Value")
結果は次のとおりです。
<input id="Name" name="Name" type="hidden" value="Value">
コントローラーでは、次のようなアクションを実行できます。
[HttpPost]
public ActionResult MyAction(MyModel model)
{
}
そして、次のようなモデル:
public class MyModel
{
public string Name { get; set; }
}
上記で使用した生のHtml.Hidden
は、モデルのName
プロパティに関連付けられます。ただし、プロパティの値 "Name"を文字列( "Name")を使用して指定する必要があることはやや不快です。モデルのName
プロパティの名前を変更すると、コードが破損し、エラーの把握が多少難しくなります。一方、HiddenFor
を使用すると、それから保護されます。
Html.HiddenFor(x => x.Name, "Value");
Name
プロパティの名前を変更すると、プロパティが見つからないことを示す明示的な実行時エラーが発生します。さらに、x.
と入力した後にメンバーのドロップダウンを取得するなど、静的分析の他の利点も得られます。
Html.Hiddenは非表示の入力を作成しますが、Html.HiddenFor
渡すオブジェクトtatの非表示の入力を作成すると、次のようになります。
Html.Hidden("yourProperty",model.yourProperty);
Html.HiddenFor(m => m.yourProperty)
この場合、出力は同じです!
HtmlHelperクラスのすべてのメソッドには、For
サフィックスの付いたツインがあります。 Html.Hiddenは引数として文字列を受け取りますが、Html.HiddenForはExpressionを受け取ります強く型付けされたビューこれから恩恵を受けることができ、そのメソッドにlambda expressionこのようにフィードできます
o=>o.SomeProperty
Html.Hiddenメソッドを使用する場合の「SomeProperty」の代わりに。
Html.Hidden( 'name'、 'value')は、name = 'name'およびvalue = 'value'の隠しタグを作成します。
Html.HiddenFor(x => x.nameProp)は、name = 'nameProp'およびvalue = x.namePropの隠しタグを作成します。
額面では、これらは似たようなことをしているように見え、一方は他方よりも便利です。ただし、実際の値はモデルバインディング用です。 MVCがhtmlをモデルに関連付けようとする場合、プロパティの名前が必要です。Html.Hiddenの場合、「nameProp」ではなく「name」を選択したため、バインディングは機能しません。カスタムバインディングオブジェクトを持っているか、フォームデータから値を取得する必要があります。ページを再表示する場合は、モデルを値に再度設定する必要があります。
したがって、Html.Hiddenを使用できますが、名前を間違えたり、モデルのプロパティ名を変更したりすると、フォームの送信時に自動バインドが失敗します。ただし、型チェック式を使用すると、コード補完が得られ、プロパティ名を変更すると、コンパイル時エラーが発生します。そして、フォームに正しい名前が含まれることが保証されます。
MVCの優れた機能の1つ。
Html.HiddenおよびHtml.HiddenForは、コントローラーのアクションメソッドによって待機された名前と値のペアを生成するために使用されます。サンプル使用法(*):
@using (Html.BeginForm("RemoveFromCart", "Cart")) {
@Html.Hidden("ProductId", line.Product.ProductID)
@Html.HiddenFor(x => x.ReturnUrl)
<input class="btn btn-sm btn-warning"
type="submit" value="Remove" />
}
アクションメソッドが「ProductId」を待つ場合、(Html.HiddenまたはHtml.HiddenFor)を使用してフォームにこの名前を生成する必要があります。強く型付けされたモデルでこの名前を生成できない場合は、この名前を「ProductId」という文字列。
public ViewResult RemoveFromCart(int productId, string returnUrl){...}
Html.HiddenFor(x => line.Product.ProductID)を記述した場合、ヘルパーは「line.Product.ProductID」という名前の非表示フィールドをレンダリングします。フィールドの名前は、「ProductId」の名前を待機する「RemoveFromCart」アクションメソッドのパラメータの名前と一致しません。これにより、デフォルトのモデルバインダーが機能しなくなるため、MVCフレームワークはメソッドを呼び出すことができません。
*アダムフリーマン(Apress-Pro ASP.Net MVC 5)