MVC - 如何将模型从视图传递到控制器

4
我正在使用一个模型,需要通过一系列控制器和视图进行操作(仅在第一个控制器上加载)。有没有一种方法可以将模型从视图保留到控制器等等?
这是我的代码。
模型:
    public class ROWModel
{
    #region Properties
    //Request
    public List<TBLRETURNABLEITEMS> TBLRETURNABLEITEMS { get; set; }
    //public List<ReturnReasons> ReturnReasons { get; set; }

    public int Order_No { get; set; }
    public string First_Name {get; set; }
    public string Last_Name {get; set; }
    public string Company { get; set; }
    public string Address_1 { get; set; }
    public string Address_2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Postal_Code { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string CustomerCode {get; set; }
    public string TerritoryCode {get; set; }


    //Post

    #endregion

    #region Constructor
    public ROWModel()
    { }
    #endregion
}

public class ReturnableItems : IComparable<ReturnableItems>
{
    private int _id;
    private decimal _ordered;
    private decimal _shipped;

    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    public decimal Ordered
    {
        get { return _ordered; }
        set { _ordered = value; }
    }

    public decimal Shipped
    {
        get { return _shipped; }
        set { _shipped = value; }
    }

在填充模型并将其发送到视图后,一切都使用模型显示,这是正确的。我认为可以将模型粘贴到表单标记上,就像这样:
<% using (Html.BeginForm("Items", "ROW", Model))

这是ROW控制器中的“Items Action”帖子。
    [ActionName("Items"), AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Items(ROWModel model, FormCollection collection)

问题是模型没有返回我最初填充的TBLRETURNABLEITEMS列表。它保留了我填充的其他属性,但不是列表。如果我想要维护这个模型的数据而不必在每个控制器上重新加载它,该怎么办?

1
你不能只是在Action方法上添加视图模型类型作为参数吗?public ActionResult ActionOnSecondController(MyViewModel model) {...} - mxmissile
我本以为可以,但是我没有得到任何List<TBLRETURNABLEITEMS>项目的返回。这可能是因为我正在使用部分类来显示List<TBLRETURNABLEITEMS>项目吗?我认为不会,因为视图和部分类都继承自模型。 - Billy Logan
5个回答

10

我认为你可以使用TempData来实现这个功能。

所以大致类似于这样:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult TestA()
    {
        MyModel model = new MyModel();
        model.Something = "Test";
        return View(model);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult TestA(MyModel model)
    {
        TempData["MyModel"] = model;
        return RedirectToAction("TestB");
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult TestB()
    {
        MyModel myModel = (MyModel)TempData["MyModel"];
        return View(myModel);
    }

1
你是第一个正确回答的人。TempData是解决这个问题的准确方案。然而,经过更多的研究,由于数据库并发和我们的站点坐落在负载平衡服务器上,可能不适合我的情况。 - Billy Logan
如果您正在尝试传递一个复杂对象,您还需要对其进行序列化。请参见此答案 - Automate This

3

谢谢您的回复,但我不想在每个控制器操作中完全重新加载模型,只需要初始加载即可。在此链接中没有看到任何详细信息。 - Billy Logan
好的。但是你如何处理并发问题?如果有人在您的页面视图之间编辑数据会发生什么? - Robert Harvey
那是一个很好的观点。看起来我可能会走上我不想走的道路,即在每个控制器操作中进行数据库重载。 - Billy Logan

1

你可以使用session来解决这种问题。 如果帖子是连续的,你也可以使用tempdata。 如果你在Intranet网络中运行应用程序,每次从数据库中获取数据也是可行的。


-1

从视图到控制器获取模型(任何模型)非常简单。

这里的其他人已经涵盖了将模型对象作为参数传入的部分。

你似乎缺少的是列表绑定,它基于视图中表单元素的名称进行。基本上,它们必须像 C# 列表元素一样看起来像字符串。因此,不知道您的列表元素的任何属性,类似以下内容:

<%= Html.TextBox("model.TBLRETURNABLEITEMS[0].ItemId") %>

显然,这只是一个字符串,因此您可以在循环中构造它以执行多行可返回。


鉴于我上面的代码,您将如何加入这个呢?我仍然无法提交模型并在TBLRETURNABLEITEMS中获取任何项目。虽然我可能不会走这条路,因为存在数据库并发问题,但这仍然可以回答我的最初问题。 - Billy Logan

-1

我认为在MVC中,会话(session)是一个方便的选项,而不是通过ViewModel来应对返回操作。


请解释你的答案。 - neophyte

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