2017-08-29 105 views
0

我有一个窗体(使用主视图模型),然后是部分视图来实现窗体的地址部分(辅助视图模型)。当我提交表单时,我没有回到表单的内部部分视图部分的值。没有得到任何错误,只是失去了部分的价值。代码如下:失去部分视图模型表格值

形式的

“主” 部分:

@model REMS.ViewModels.AddComplexViewModel 

@{ 
    ViewBag.Title = "Add Complex"; 
} 

<h2>@ViewBag.Title</h2> 

@{ Html.Partial("~/Views/Shared/Partials/ActionStatusPartial.cshtml", Model.ActionStatusMessageViewModel); } 

@using (Html.BeginForm("AddComplex", "Admin", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
{ 
    @Html.AntiForgeryToken() 
    <h4>Add a New Complex</h4> 
    <hr />  
    <div class="form-group"> 
     @Html.LabelFor(m => m.Name, new { @class = "col-md-2 control-label" }) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) 
     </div> 
    </div> 

    @Html.Partial("~/Views/Shared/Partials/AddressFormPartial.cshtml", Model.AddressViewModel) 

    <div class="form-group"> 
     @Html.Label("Owner", new { @class = "col-md-2 control-label" }) 
     <div class="col-md-10"> 
      @Html.DropDownList("SelectedOwner", Model.Owners, "Select an Owner...") 
     </div> 
    </div> 
    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" class="btn btn-default" value="Add" /> 
     </div> 
    </div> 
} 

形式的局部视图:

@model REMS.ViewModels.AddressViewModel 

<div class="form-group"> 
@Html.LabelFor(m => m.Address1, new { @class = "col-md-2 control-label" }) 
<div class="col-md-10"> 
    @Html.TextBoxFor(m => m.Address1, new { @class = "form-control" }) 
</div> 
</div> 
<div class="form-group"> 
    @Html.LabelFor(m => m.Address2, new { @class = "col-md-2 control-label" }) 
    <div class="col-md-10"> 
     @Html.TextBoxFor(m => m.Address2, new { @class = "form-control" }) 
    </div> 
</div> 
<div class="form-group"> 
    @Html.LabelFor(m => m.City, new { @class = "col-md-2 control-label" }) 
    <div class="col-md-10"> 
     @Html.TextBoxFor(m => m.City, new { @class = "form-control" }) 
    </div> 
</div> 
<div class="form-group"> 
    @Html.LabelFor(m => m.State, new { @class = "col-md-2 control-label" }) 
    <div class="col-md-10"> 
     @Html.TextBoxFor(m => m.State, new { @class = "form-control" }) 
    </div> 
</div> 
<div class="form-group"> 
    @Html.LabelFor(m => m.Zip, new { @class = "col-md-2 control-label" }) 
    <div class="col-md-10"> 
     @Html.TextBoxFor(m => m.Zip, new { @class = "form-control" }) 
    </div> 
</div> 

视图模型:

public class AddComplexViewModel 
{ 
    [Display(Name = "Name")] 
    public string Name { get; set; } 

    [Display(Name = "AddressViewModel")] 
    public AddressViewModel AddressViewModel { get; set; } 

    [Display(Name = "SelectedOwner")] 
    public Guid SelectedOwner { get; set; } 

    [Display(Name = "Owners")] 
    public SelectList Owners { get; set; } 

    [Display(Name = "ActionStatusMessageViewModel")] 
    public ActionStatusViewModel ActionStatusMessageViewModel { get; set; } 

    public AddComplexViewModel() 
    { 
     ActionStatusMessageViewModel = new ActionStatusViewModel(); 
     AddressViewModel = new AddressViewModel(); 
    } 
} 


public class AddressViewModel 
{ 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zip { get; set; } 
} 

当我提交的形式地址值全为空。我错过了什么吗?

+0

局部视图仍技术上来看,你不能够从部分获取值只是因为它是主视图的形式中。你可以使用像这里概述的编辑器模板 - > https://stackoverflow.com/questions/5197038/complex-models-and-partial-views-model-binding-issue-in-asp-net-mvc-3 – ragerory

+0

该解决方案工作。现在有其他问题,但与此无关。你可以添加这个答案,以便我可以将其标记为已接受?谢谢! –

回答

0

部分视图在技术上还视图。仅仅因为它位于主视图窗体的内部,您无法从部分获取值。

调查Editor Templates,他们可以让你实现你正在寻找的东西。

更多对here

0

传递给您的主要的AddComplexViewModel模型的部分视图来生成输入的正确名称。我假设在AddComplex方法中,您将AddComplexViewModel作为参数。

变化主要形式:

@Html.Partial("~/Views/Shared/Partials/AddressFormPartial.cshtml", Model.AddressViewModel) 

到:

@Html.Partial("~/Views/Shared/Partials/AddressFormPartial.cshtml", Model) 

然后在局部视图变化:

@model REMS.ViewModels.AddressViewModel 

到:

@model REMS.ViewModels.AddComplexViewModel 

并且每个拉姆达等:

m => m.Address1 

到编辑后

m => m.AddressViewModel.Address1 

整个局部视图:

@model WebApplication2.Controllers.AddComplexViewModel 

<div class="form-group"> 
@Html.LabelFor(m => m.AddressViewModel.Address1, new { @class = "col-md-2 control-label" }) 
<div class="col-md-10"> 
    @Html.TextBoxFor(m => m.AddressViewModel.Address1, new { @class = "form-control" }) 
</div> 
</div> 
<div class="form-group"> 
@Html.LabelFor(m => m.AddressViewModel.Address2, new { @class = "col-md-2 control-label" }) 
<div class="col-md-10"> 
    @Html.TextBoxFor(m => m.AddressViewModel.Address2, new { @class = "form-control" }) 
</div> 
</div> 
<div class="form-group"> 
@Html.LabelFor(m => m.AddressViewModel.City, new { @class = "col-md-2 control-label" }) 
<div class="col-md-10"> 
    @Html.TextBoxFor(m => m.AddressViewModel.City, new { @class = "form-control" }) 
</div> 
</div> 
<div class="form-group"> 
@Html.LabelFor(m => m.AddressViewModel.State, new { @class = "col-md-2 control-label" }) 
<div class="col-md-10"> 
    @Html.TextBoxFor(m => m.AddressViewModel.State, new { @class = "form-control" }) 
</div> 
</div> 
<div class="form-group"> 
@Html.LabelFor(m => m.AddressViewModel.Zip, new { @class = "col-md-2 control-label" }) 
<div class="col-md-10"> 
    @Html.TextBoxFor(m => m.AddressViewModel.Zip, new { @class = "form-control" }) 
</div>