【问题标题】:Can't populate ViewModel无法填充 ViewModel
【发布时间】:2012-07-30 03:50:59
【问题描述】:

MVC3 项目。

我有几个类:我在视图模型中设置的帐户、地址、电话等

namespace ViewModels
{
  public class AccountVM
  {
    public Account Account { get; set; }
    public Address Address { get; set; }
    public Phone Phone { get; set; }       }

在控制器的 GET 操作中我只是调用视图

  public ActionResult Create()
  { return View(); }

在视图中我通过视图模型

@model AccountVM

然后我使用@Html.EditorFor 填充所有字段并成功地将其传递给POST 操作并在数据库中创建记录。所以所有的代码都在工作。

@Html.EditorFor(z => z.Account.Number)

当我尝试预填充一些属性时,问题就出现了。我在 GET 操作中执行以下操作。

    public ActionResult Create()
    { var viewModel = new AccountVM();
      viewModel.Account.Number = 1000000;
      return View(viewModel); }

代码通过 Intellisense,但运行时出现“用户代码未处理 NullReferenceException - 对象引用未设置为对象实例”错误。

如果我尝试使用视图中的代码进行填充,我会遇到同样的错误。

@{ Model.Account.Number = 1000000; }

我需要能够以编程方式填充控制器和视图中的属性。我已经阅读了几篇关于如何在控制器中填充视图模型并在它们上建模我的代码的 SO 帖子,但由于某种原因我的代码无法正常工作。我在这里做错了什么?我应该如何在控制器和视图中处理它?我知道对象在创建时为空,但不知道如何解决。

谢谢

【问题讨论】:

    标签: asp.net-mvc-3 asp.net-mvc-viewmodel


    【解决方案1】:

    您已经实例化了 VM,但没有实例化其 Account 属性...试试这个:

    public ActionResult Create()
    {
        var viewModel = new AccountVM();
        viewModel.Account = new Account();
        viewModel.Account.Number = 1000000;
        return View(viewModel);
    }
    

    视图也是如此:

    @{
        if (Model.Account == null) {
            Model.Account = new Account();
        }
        Model.Account.Number = 1000000;
    }
    

    虽然很少有这可能属于视图。它看起来应该在控制器中设置。

    【讨论】:

    • 鼓声。实际上我已经这样做了,但是出现了一个错误,然后在我的故障排除中被跟踪(一定是一个错字)。这是需要做的。谢谢你让我回到正轨。我还发现,为了将控制器中设置的任何值传递给发送到 POST 操作的模型,您需要为视图中输入表单中的每个属性使用 @Html.HiddenFor。 @Html.HiddenFor(z => z.Account.Number)
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多