0

HtmlHelper.Hidden の動作がわかりません。

これは、Views/Shared/DisplayTemplates/Test.cshtml 内のテンプレートからのものです。アイデアは、リスト内の要素の横に削除ボタンを出力することでした。したがって、ビューは IEnumerable のモデルを受け入れ、 @Html.EditorForModel() を使用して各テスト項目を出力します。

したがって、これを Test.cshtml に入れると:

<input type="hidden" name="Name" value="@Model.Name"/>
@Html.Hidden("Name2", Model.Name) 

それはこれをもたらします:

<input type="hidden" name="Name" value="test"/> 
<input id="RoleList_12__Name2" name="RoleList[12].Name2" type="hidden" value="test" />

Html ヘルパーの名前が、私が指示したものと異なるものをレンダリングするのはなぜですか? これは意図的なものだと思いますが、理由がわかりません。

アップデート

コントローラーで RoleList[12].Name を取得するにはどうすればよいですか?

私の削除機能は受け入れます:

[HttpPost]        
public ActionResult DeleteRole(Roles.Test model)
{
}

RoleList[12] name アイテムをどのように受け入れることができますか? 試してみると、常に null が返されます。

4

2 に答える 2

0

これは、ビューがモデル タイプの IEnumerable を受け入れるために発生しています。基本的にビューに渡されたオブジェクトのリストがあり、それらはすべて Name という名前のプロパティを持っているため、バインダーは model[index]property のような名前を付けて異なるインスタンスを区別しようとしています。

インスタンスを削除しようとしている場合は、削除しようとしているインスタンスの一意の ID を取るコントローラーの何らかのアクションを呼び出す Html.ActionLink リンクが必要です。あなたの見解では、このようなもの:

@foreach (var item in model)
{
   @Html.ActionLink("linkText", "DeleteRole", "controllerName", new {id = item.RoleId})
}

次に、コントローラーには次のようなアクションが必要です。

public ActionResult DeleteRole(int id)
{
    // Logic to delete role based on provided role ID.
    return View();
}
于 2013-06-23T12:30:39.397 に答える
0

(既定の) モデル バインディングが機能するようにするためです。つまり、ポストされると、フィールドは、モデル クラスと同等のパラメーターを受け取る Controller の RoleList[12].Name に解決されます。

コントローラー アクションがモデル クラスを参照しない場合、データは黙って破棄されるため、データ全体をポストバックする必要はありませんが、ポストバックされたものは認識されます。

デフォルトのモデル バインディングをオーバーライドできます。ASP.NET MVC モデル バインディングの機能と欠点を参照してください。


削除の問題は、それが間違ったレベルにあることです。列挙型のインスタンスに何かをバインドするか、独自の形式でラップするか (少量のデータの場合は OK)、列挙型の ID が渡される @ActionLink を持つことにします。私は通常、次のような 2 番目の方法を実行します。

@Html.ActionLink("Del", "DeleteRole", "Controller", new { Id = item.Id}, new { @class = "btn"})

もちろん、上記は [Post] アクションを必要としないため、コントローラーで変更する必要があります。

上記は、必要に応じて表示または編集テンプレートに配置されます。

于 2013-06-23T11:37:32.983 に答える