MVC 将 ViewModel 传递给@Html.Partial

MVC Passing ViewModel to @Html.Partial

正在将 ViewModel 传递给@Html.Partial

有两个 ViewModel

public class RegisterVM
{
  ... some properties
  public AddressVM AddressInformation { get; set; } //viewmodel
}

public class AddressVM {
   public string Street1 { get; set; }
   public string Street2 { get; set; }
   public string PostalCode { get; set; }
}

使用 VM 加载主视图时:

    @model ViewModels.RegisterVM

所有字段负载。但是当我添加局部视图并传递视图模型时

     @Html.Partial("_AddressDetails", Model.AddressInformation)

失败 错误:异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。为什么会失败?

部分视图 _AddressDetails 需要

         @model ViewModels.AddressVM 

更新

根据 Prashant 的更改,

提交信息时Address信息为NULL。 在控制器中:

    [HttpPost]
    public ActionResult Register(RegisterVM vm){
     ...
    //when viewing vm.AddressInformation.Street1 is null. and there is a value
    //Is there a different way of retrieving the values from partial view?
    }

感谢阅读。

这对我有用。您只需要实例化您的 VM,附加它并将其发送到视图。

页面操作

public ActionResult Page(){
     RegisterVM vm = new RegisterVM();
     vm.AddressInformation = new AddressVM();
     return View(vm);
}

Page.cshtml

@model Project.Web.Models.RegisterVM
<!-- loading partial view -->
@Html.Partial("_AddressDetails",Model.AddressInformation)

部分查看文件

<input type="text" name="name" value=" " />

我没有关于代码的更多信息,但根据提到的细节,你能试试这个吗 public ActionResult Register(){ return View(register); }

我知道您可能尝试过此操作,但尝试分配显式值。因为这是基本的 MVC 实现。如果无法解决,那么您需要提供更多代码详细信息。

希望对您有所帮助。

错误产生是因为属性 AddressInformation为null,你需要在传递给视图之前在无参数构造函数或控制器中对其进行初始化,例如

public class RegisterVM
{
  public RegisterVM() // default constructor
  {
    AddressInformation = new AddressVM();
  }
  public AddressVM AddressInformation { get; set; }
  ....
}

无论您如何使用,都意味着生成的控件将是

<input name="Street1" .../>

而他们需要

<input name="AddressInformation.Street1" .../>

以便绑定到您的模型。您可以将部分设为 EditorTemplate (/Views/Shared/EditorTemplates/AddressVM.cshtml) 并在主视图中用作

@Html.EditorFor(m => m.AddressInformation)

或将前缀作为附加项传递给部分 ViewData

@Html.Partial("_AddressDetails", Model.AddressInformation, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "AddressInformation" }})

在 Register get 方法中必须实例化您的 viewModel,因为在视图中,调用 other partial with viewModel members(properties);

public ActionResult Register(){
 RegisterVM vm = new RegisterVM();
 return View(vm);
}