在ASP.NET MVC5中如何将整个对象从视图传递到控制器

4
有没有一种方法可以从ASP.NET MVC 5视图传递整个对象到控制器?我的情况如下:
  • 我有一个显示从数据库表中所有行的视图
  • 视图的模型是IEnumerable
  • 每一行的数据后面都有一个链接,指向生成的UPDATE视图
有没有一种方法可以将整个对象传递给Update控制器方法,以便最初填充旧数据的表单输入?类似于:
@Html.Action("Update me!", "Update", new { objectFromModelList })

接着,在控制器中

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

或者类似的东西。请帮忙,我是新手,找不到答案。


1
你能发布整个视图吗? - Blue Eyed Behemoth
3个回答

6

您的对象可能非常大!查询字符串在基于浏览器的数据传递方面有一定限制。您应该考虑传递记录的唯一标识符值,并在操作方法中使用它从数据库获取整个记录,然后将其传递给视图。

@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,所以谢谢你。 - dzenesiz

3
假设你的更新视图不是类型为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);
}

那么您的链接应该能够正常工作。

希望这可以帮到您!


确实有帮助。谢谢你。 - dzenesiz

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中。这样当他们返回到该网站时,这些首选项仍然保留。这是LocalStorage的一个关键属性,可能不适用于您的需求/情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接