MVC将ViewModel传递到@Html.Partial



将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实现。如果没有成功,那么您需要提供更多的代码详细信息。

希望这能有所帮助。

Register get Method中的

必须初始化您的viewModel,因为在视图中,使用viewModel成员(proprties)调用其他分部;

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

相关内容

  • 没有找到相关文章

最新更新