如何在Html.actionLink的参数中传递IEnumerable Model

Ste*_*ffi 1 asp.net-mvc razor asp.net-mvc-3

我有个问题.我需要保存模型的所有值.

在index.cshtml中,我有:

@model IEnumerable

在我看来,我可以在foreach中获得所有的价值观.

@foreach(模型中的var项目){item.ID,item.Name}

我需要通过一个链接将我的整个模型传递给我的控制器:

html.actionlink("Save It",Save,...);

我该怎么办?

谢谢

Dar*_*rov 7

您不能使用这样的GET请求传递整个模型.您可以使用HTML表单:

@using (Html.BeginForm("Save", "SomeController"))
{
    @Html.EditorForModel()
    <input type="submit" value="Save It">
}
Run Code Online (Sandbox Code Playgroud)

您已为此模型(~/Views/Shared/EditorTemplates/Item.cshtml)定义了一个使用隐藏字段的编辑器模板:

@model Item
@Html.HiddenFor(x => x.ID)
@Html.HiddenFor(x => x.Name)
Run Code Online (Sandbox Code Playgroud)

这个部分的名称和位置很重要.它应该位于,如果Item是模型集合的类型名称,~/Views/Shared/EditorTemplates则应调用文件Item.cshtml名,即IEnumerable<Item>.将为集合的每个项目执行编辑器模板,并呈现允许将其传输到服务器的相应隐藏字段.

此表单将成功将项集合发送到以下控制器操作:

[HttpPost]
public ActionResult(IEnumerable<Item> model)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是另一种继续进行的方式.如果用户不应该修改视图上的模型值,那么您可以简单地使用一些唯一标识符,允许您从最初获取模型的任何位置重新获取模型.例如:

public ActionResult Index(int id)
{
    IEnumerable<Item> model = ... fetch the model using the id
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

并在视图中生成一个传递此id的链接:

@Html.ActionLink("Save It", Save, new { id = "123" })
Run Code Online (Sandbox Code Playgroud)