在ASP.NET MVC 5中将整个对象从视图传递到控制器

时间:2016-08-29 18:34:58

标签: c# .net asp.net-mvc asp.net-mvc-5

有没有办法将整个对象从ASP.NET MVC 5 View传递给Controller?这是我的情况:

  • 我有一个显示数据库表格中所有行的视图
  • 视图的模型是IEnumerable
  • 每行都有一个链接,该数据导致了搭建UPDATE视图的数据

有没有办法将整个对象传递给Update控制器方法,以便最初使用旧数据填充表单输入?类似的东西:

@Html.Action("Update me!", "Update", new { objectFromModelList })

然后在控制器中

public ActionResult Update(MyType parameter)
    {
        return View(parameter);
    }

或类似的东西。请帮助,我是新手,无法在任何地方找到答案。

3 个答案:

答案 0 :(得分:5)

你的物品可能太大了!查询字符串对您可以通过浏览器传递的数据量有限制。您应该考虑传递一个唯一的id(记录的)值,并使用它在您的action方法中从db获取整个记录并将其传递给视图。

@foreach(var item in SomeCollection)
{
  <tr>
    <td> @Html.Action("Update me!", "Update", new {  id = item.Id }) </td>
  </tr>
}

并在动作方法中

public ActionResult Update(int id)
{
    var item = GetItemFromId(id);
    return View(item);
}

假设GetItemFromId方法从唯一的id值返回方法/视图模型。基本上,您可以使用db表/存储库中的唯一ID来获取整个记录。

答案 1 :(得分:2)

假设您的更新视图不​​是IEnumerable类型...

您只需要将要发送的记录的ID传递给更新视图...

像这样:

@Html.Action("Update me!", "Update", new { id = item.ID })

然后您的更新操作将如下所示:

[HttpGet]
public ActionResult Update(int id)
{
    var parameter = db/* connection string variable */.TableName.Find(id);
    return View(parameter);
}

然后你的链接应该正常工作。

希望这有帮助!

答案 2 :(得分:0)

我进行了自我搜索,发现除了传递ID之外,最好的方法是将您可能需要的任何其他变量存储到隐藏的输入字段或HTML5标签中。然后,您可以编写一种脚本来处理任何按钮/链接单击事件。这样,您可以存储每个记录的重要对象属性,并将它们轻松地传递回控制器。在此处考虑客户端,一旦数据最终成为客户端,请使用客户端工具进行处理并将其传递回服务器端/控制器。

我对某种类型的图书馆预订系统做了类似的事情,该系统允许用户在可用的日期上预订项目。我将所有可用记录传递给视图。每个记录都有一些我要保留的字段,包括ID供用户参考。当用户单击按钮时,我将收集必填字段。

您可以使用隐藏的HTML5表单输入字段,也可以仅使用JavaScript使用GetElementByID收集这些值。例如,将ID存储在div包装器中。然后让另一个div保留一个子参数。您可以使用Javascript查找记录ID,然后通过其ID获取第二个div。例如将从XRecord获取ID NameRecord,其中X =传递的ID。

然后我将这些值传递给控制器​​,为保留实例化一个新的类/对象。新的类对象还具有项目类/对象作为属性。例如,考虑以下内容;

    var reservation = new Reservation
    {
    myKit = new ResourceKit()
    };

此后,如果需要在其上进行构建,可以将其存储在会话中。在我的情况下,我将其保留在一个会话中,因为我允许用户检查可用性/日期。这些项目是类似于图书馆一样被检出的物理资源,并通过办公室邮件进行转移。

如果您不介意位于客户端的数据,则可以使用LocalStorage和JavaScript进行存储。此类数据根本不像Cookie那样安全。我使用此方法的一种方法是设置网站首选项。用户可以选择一种配色方案,这些首选项存储在LocalStorage中。这样,当返回站点时,这些首选项将保留。这是LocalStorage的关键属性,可能不适用于您的需求/情况。