2013-06-23 76 views
0

HtmlHelper.Hidden的行为不见了。asp.net mvc Html助手隐藏字段行为奇怪

这是来自Views/Shared/DisplayTemplates/Test.cshtml中的模板。想法是在列表中的元素旁边输出一个删除按钮。所以视图接受一个I​​Enumerable模型,然后使用@ 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

这样就可以使(默认)模型绑定起作用;即发布时,该字段将被解析为控制器中的角色列表[12]。名称,其采用与模型类相同的参数。

如果您的控制器操作没有引用模型类,数据将被无声地丢弃,这样您就不必回发整个数据 - 但是回传的内容将为您实现。

您可以覆盖默认的模型绑定;看到The Features and Foibles of ASP.NET MVC Model Binding


你删除的问题是,它是在错误的水平;或者将某些东西绑定到enumerable的实例上 - 以自己的形式包装(对于少量数据可以正常使用),或者您决定使用@ActionLink将枚举的ID传递给它。我通常做的第二个,像这样:

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

当然,上述并不需要[后]的行动,所以需要改变你的控制器。

上述内容将根据您的显示器或编辑模板而定。

+0

更新与问候你的反应一个问题的问题。 – Patrick

+0

@Patrick用例子更新了答案。 –

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