【问题标题】:MVC - How to pass model from view to controllerMVC - 如何将模型从视图传递到控制器
【发布时间】:2009-12-03 19:04:30
【问题描述】:

我正在使用一个模型,该模型需要流经一系列控制器和视图,并在此过程中对其进行操作(仅将其加载到第一个控制器上)。有没有办法将模型从视图中持久化回控制器等等?

这是我的代码。

型号:

    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 控制器的 post Items Action:

    [ActionName("Items"), AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Items(ROWModel model, FormCollection collection)

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

【问题讨论】:

  • 你不能只添加视图模型类型作为 Action 方法的参数吗?公共 ActionResult ActionOnSecondController(MyViewModel 模型) {...}
  • 我想我可以,但我没有得到任何 List 项目。这可能是因为我使用部分类来显示 List 项目吗?我不这么认为,因为视图和部分都继承自模型。

标签: asp.net-mvc model-view-controller


【解决方案1】:

我认为您可以使用 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);
    }

【讨论】:

  • 您是第一个正确回答的人。 TempData 是此问题的准确解决方案。然而,经过更多研究,由于数据库并发和我们的站点位于负载平衡服务器上,这对我的情况可能不是一个好主意。
【解决方案2】:

NerdDinner 第 6 步:ViewData 和 ViewModel
http://nerddinnerbook.s3.amazonaws.com/Part6.htm

【讨论】:

  • 感谢您的回复,但我不想在每个控制器操作上完全重新加载模型。只是最初的。在此链接中看不到任何详细说明。
  • 好的。但是如何处理并发问题?如果有人在您的页面浏览之间编辑数据会怎样?
  • 这很好。猜猜我可能会走上我不想走的路,那就是对每个控制器操作进行数据库化和重新加载。
【解决方案3】:

您可以使用会话来解决此类问题。 或者,如果帖子是连续的,您可以使用 tempdata。 如果您在 Intranet 网络中运行应用程序,则每次从 DB 中获取都有效。

【讨论】:

    【解决方案4】:

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

    这里的其他人已经介绍了您将模型对象作为参数的部分。

    您似乎缺少的是列表的绑定,这是根据视图中表单元素中的名称发生的。基本上,它们必须看起来像 C# 列表元素作为字符串。因此,不知道列表元素的任何属性,例如:

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

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

    【讨论】:

    • 鉴于我上面的代码,您将如何合并它。我仍然无法提交模型并让任何项目出现在 TBLRETURNABLEITEMS 中。虽然我可能不会因为数据库并发问题而走这条路,但这仍然可以回答我最初的问题。
    【解决方案5】:

    我认为在 MVC 中 session 也是一个方便的选择,而不是使用 Viewmodel 恢复操作。

    【讨论】:

    • 请解释你的答案。
    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 2010-11-25
    • 2013-07-08
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多