MVC将ViewModel传递给@ Html.Partial

时间:2015-03-28 17:29:20

标签: asp.net-mvc viewmodel partial-views

将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

所有现场加载。但是当我添加部分视图并传递viewmodel

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

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

部分View _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?
    }

感谢阅读。

4 个答案:

答案 0 :(得分:3)

生成错误是因为属性AddressInformation为空,并且在将其传递给视图之前需要在无参数构造函数或控制器中初始化它,例如

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" }})

答案 1 :(得分:0)

这对我有用。您只需要实例化您的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=" " />

答案 2 :(得分:0)

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

我知道你可能试过这个,但试着分配明确的价值。因为这是基本的MVC实现。如果它没有成功,那么你需要提供更多的代码细节。

希望这有帮助。

答案 3 :(得分:0)

注册get方法中的

必须实例化你的viewModel,因为在视图中,使用viewModel成员(属性)调用其他部分;

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