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

问题描述 投票:3回答:3

有没有办法将整个对象从ASP.NET MVC 5视图传递给控制器​​?这是我的情况:

  • 我有一个显示数据库表中所有行的视图
  • 视图的模型是IEnumerable
  • 每行都有一个链接,它的数据通向scaffolded UPDATE视图

有没有办法将整个对象传递给Update控制器方法,以便它最初用旧数据填充表单输入?就像是:

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

然后在控制器中

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

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

c# .net asp.net-mvc asp.net-mvc-5
3个回答
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获取整个记录。


2
投票

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

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

像这样:

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

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

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

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

希望这可以帮助!


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的关键属性,可能不适用于您的需求/情况。

© www.soinside.com 2019 - 2024. All rights reserved.