2016-09-07 48 views
3

我有一個剃鬚刀視圖,其中將包含5個表單。 (A,B,C,D,E)。每種形式都有自己的ViewModel(AViewModel,BViewModel,CViewModel,DViewModel,EViewModel)。在MVC Razor View上使用單個視圖模型發佈多個表單

我創建了一個父頁面ProductViewModel,該頁面將用作其唯一的ViewModel。在這個ViewModel中將會是頁面上每個表單的所有其他ViewModel(如上所列)。

這裏是什麼ProductViewModel的屬性如下所示:

public AViewModel { get; set; } 
public BViewModel { get; set; } 
public CViewModel { get; set; } 
public DViewModel { get; set; } 
public EViewModel { get; set; } 

我的Razor視圖如下所示:

@model MVCApp.ViewModels.ProductViewModel 

@{ 
    ViewData["Title"] = "Product Detail"; 
} 

<h2>Product Detail</h2> 

<form asp-controller="A" asp-action="Save" data-ajax="true" data-ajax-method="POST"> 
    <div class="form-horizontal"> 
     <h4>Form A</h4> 
     <hr /> 
     <div asp-validation-summary="ModelOnly" class="text-danger"></div> 
     <div class="form-group"> 
      <label asp-for="AViewModel.Name" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="AViewModel.Name" class="form-control"/> 
       <span asp-validation-for="AViewModel.Name" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="AViewModel.StartDate" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="AViewModel.StartDate" class="form-control"/> 
       <span asp-validation-for="AViewModel.StartDate" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="AViewModel.EndDate" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="AViewModel.EndDate" class="form-control"/> 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
</form> 

<div> 
    <a asp-action="Index">Back to List</a> 
</div> 

@section Scripts { 
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} 
} 

當點擊保存按鈕我在結束了保存(POST)A控制器的操作方法與我所預期的一樣:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public IActionResult Save(AViewModel viewModel) 
    { 
     return Ok(); 
    } 

但是,我注意到viewModel param的所有屬性都是空的。

這是否意味着我真的必須將ProductViewModel對象作爲我的ViewModel傳遞給所有這些表單中的所有5個保存操作方法,其中只有ViewModel在作用域中將被填充,其他一切都將爲空?或者,還有更好的方法?

回答

5

我建議使每個形成一個局部視圖,並通過在只從父模型

@{await Html.RenderPartialAsync("AViewPartial", Model.AViewModel); } 

那麼你在部分輸入可以從

<input asp-for="AViewModel.Name" class="form-control"/> 

改爲

所需的子模型
<input asp-for="Name" class="form-control"/> 

這應該使它與模型綁定器正確綁定,以便它傳遞到您的動作

+0

部分視圖正是我所需要的。謝謝! –

2

您的POST方法參數需要爲ProductViewModel

這樣做的原因是,因爲性質在你的HTML命名方式:

<input asp-for="AViewModel.Name" class="form-control"/> 

模型綁定需要你的序列化形式,並看到你發送POST方法的值屬性名稱爲AViewModel.Name。當你的參數是AViewModel型的,它沒有找到任何東西,因爲它在尋找你的參數類型的孩子財產AViewModel一個名稱,然後分配對象的Name屬性輸入的值。

如果您不想讓您的每個POST方法ProductViewModel的參數,那麼你有一個領先的另類:爲您五種不同形式的局部視圖,並從ProductViewModel在各個屬性作爲傳遞模型爲局部視圖。然後這將消除asp-for屬性中的AViewModel屬性前綴。

相關問題