将ViewModel传递到@Html.Partial
有两个ViewModels
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的变化,
提交信息时,地址信息为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?
}
感谢阅读。
由于属性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" }})
这对我很有用。你只需要实例化你的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实现。如果没有成功,那么您需要提供更多的代码详细信息。
希望这能有所帮助。
必须初始化您的viewModel,因为在视图中,使用viewModel成员(proprties)调用其他分部;
public ActionResult Register(){
RegisterVM vm = new RegisterVM();
return View(vm);
}