asp.net mvc Html helper隐藏字段表现奇怪

时间:2013-06-23 11:27:09

标签: c# asp.net-mvc razor html-helper

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。

2 个答案:

答案 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();
}