【问题标题】:Pass entire object from view to controller in ASP.NET MVC 5在 ASP.NET MVC 5 中将整个对象从视图传递到控制器
【发布时间】:2017-01-05 21:03:13
【问题描述】:

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

  • 我有一个显示数据库表中所有行的视图
  • 视图的模型是 IEnumerable
  • 每一行在其数据之后都有一个链接,该链接指向脚手架的 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


【解决方案1】:

你的对象可能这么大!查询字符串对您可以通过基于浏览器的数据传递的数据量有限制。您应该考虑传递一个唯一的 id 值(记录的)并使用它从您的操作方法中的 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 值返回方法/视图模型。基本上,您可以使用数据库表/存储库中的这个唯一 ID 获取整个记录。

【讨论】:

  • 好吧,我确实打算避免使用那些凌乱的 URL,所以是的...非常感谢。
【解决方案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);
}

那么您的链接应该可以正常工作。

希望这会有所帮助!

【讨论】:

  • 确实有帮助。谢谢你。
【解决方案3】:

我已经搜索过自己,除了传递 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 的一个关键属性,可能不适用于您的需求/情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多