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

时间:2011-04-15 22:24:05

标签: asp.net-mvc asp.net-mvc-3 razor

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

在index.cshtml中,我有:

  

@model IEnumerable

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

  

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

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

  

html.actionlink(“Save It”,Save,...);

我该怎么办呢?

由于

1 个答案:

答案 0 :(得分:7)

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

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

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

@model Item
@Html.HiddenFor(x => x.ID)
@Html.HiddenFor(x => x.Name)

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

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

[HttpPost]
public ActionResult(IEnumerable<Item> model)
{
    ...
}

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

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

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

@Html.ActionLink("Save It", Save, new { id = "123" })