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]名称项目?如果我尝试,它总是返回null。
答案 0 :(得分:0)
这样(默认)模型绑定将起作用;即,当发布时,该字段将被解析为Controller中的RoleList [12] .Name,该参数采用与模型类等效的参数。
如果你的控制器动作没有引用模型类,那么数据将被静默地丢弃,这样你就不必回发整个数据 - 但是回传的数据将会为你实现。
您可以覆盖默认的模型绑定;见The Features and Foibles of ASP.NET MVC Model Binding
删除的问题是它处于错误的级别;要么将某些东西绑定到枚举的实例 - 以自己的形式包装(可以用于少量数据),或者你决定使用一个@ActionLink,其中传递了可枚举的ID。我通常做第二个,比如:
@Html.ActionLink("Del", "DeleteRole", "Controller", new { Id = item.Id}, new { @class = "btn"})
当然上面的内容不需要[Post]动作,因此需要在控制器上进行更改。
以上内容将根据需要显示在您的显示或编辑模板中。
答案 1 :(得分:0)
这种情况正在发生,因为您的视图接受某些模型类型的IEnumerable。你基本上有一个传递给视图的对象列表,因为它们都有一个名为Name的属性,绑定器试图通过给出像model [index]属性这样的名称来区分不同的实例。
如果您尝试删除某个实例,则应该有一个Html.ActionLink链接,该链接会调用您控制器的某些操作,该操作会获取您尝试删除的实例的唯一ID。在你看来是这样的:
@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();
}