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] 名称项?如果我尝试,它总是返回 null 。

4

2 回答 2

0

发生这种情况是因为您的视图接受某些模型类型的 IEnumerable。您基本上有一个传递给视图的对象列表,并且由于它们都有一个名为 Name 的属性,因此活页夹试图通过给它们命名 model[index]property 来区分不同的实例。

如果您尝试删除一个实例,您应该有一个 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();
}
于 2013-06-23T12:30:39.397 回答
0

这样(默认)模型绑定才能工作;即,当发布该字段时,该字段将被解析为 Controller 中的 RoleList[12].Name,该控制器采用与模型类等效的参数。

如果您的控制器操作未引用模型类,则数据将被静默丢弃,因此您不必回发整个数据 - 但回发的数据将为您实现。

您可以覆盖默认模型绑定;请参阅ASP.NET MVC 模型绑定的特性和缺点


您删除的问题在于它处于错误的级别;要么将某些东西绑定到可枚举的实例 - 以它自己的形式包装(对于少量数据来说还可以),要么你决定有一个 @ActionLink 将可枚举的 ID 传递到其中。我通常做第二个,比如:

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

当然,上述内容不需要 [Post] 操作,因此需要在您的控制器上进行更改。

以上内容将根据需要位于您的显示或编辑模板中。

于 2013-06-23T11:37:32.983 回答