2014-02-22 58 views
1

這是我使用的視圖模型查看多個型號只發布1個模型

public class MainRegisterViewModel 
{ 
    public RegisterViewModel RegisterModel { get; set; } 
    public RegisterFormValuesViewModel RegisterValues { get; set; } 
} 

RegisterFormValuesViewModel包含了控制所有的值(國家,州清單和類似的東西)和RegisterViewModel包含用戶的信息。

然後我加載這樣的控件。

@model ProjetX.Models.MainRegisterViewModel 
@{ 
    IEnumerable<SelectListItem> countries = Model.RegisterValues.Countries.Select(x => new SelectListItem() 
    { 
     Text = x.Country, 
     Value = x.Id.ToString() 
    }); 

    IEnumerable<SelectListItem> states = Model.RegisterValues.States.Select(x => new SelectListItem() 
    { 
     Text = x.State, 
     Value = x.Id.ToString() 
    }); 
} 

<div class="container"> 

    <div class="row"> 
     <div class="col-md-12"> 
      @using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
      { 

       .... 

       <div class="form-group"> 
        @Html.LabelFor(m => m.RegisterModel.Country, new { @class = "col-md-2 control-label" }) 
        <div class="col-md-10"> 
          @Html.DropDownListFor(m => m.RegisterModel.Country, countries, new { @class = "form-control" }) 
        </div> 
       </div> 

       .... 

另外,註冊功能需要MainRegisterViewModel作爲參數。

問題是,當我提交表單,RegisterFormValuesViewModelNULL

任何想法爲什麼?

謝謝

您語境

我這樣做是因爲我從API加載RegisterFormValuesViewModel,我想只有一次調用它。問題出在用戶發佈錯誤表單並返回視圖時,我不得不再次調用API以獲取RegisterFormValuesViewModel

在此之前,它只是RegisterFormValuesViewModel的一個模型和一個視圖包,但每次載入表單時都必須調用API,因爲viewbag沒有發佈。這就是爲什麼我認爲我可以使用2個模型並將它們都POST。

+2

我可能會誤解,但除非RegisterFormValuesViewModel的值在POST中,否則模型將不會重新填充。例如,'states'下拉列表的選定值將在請求中,但用於構建列表的項目不會。 –

+0

有沒有簡單的方法來發布值? – Marc

+1

喬的回答給出了一些選擇。隱藏字段是最簡單的,但你想確保你沒有創建一個巨大的請求(比如webforms viewstate)。對於不經常更改的狀態/國家/地區,您可以將它們放入緩存中。 –

回答

3

如果您希望張貼RegisterFormValuesViewModel的值,則需要將它們包含在表單或其他位置中,以供ModelBinder查找值。 (默認)模型綁定器將從動作參數,Request.Form,路由數據和Request.QueryString中獲取值(我認爲Request.Files也包含在內)。

如果您的RegisterFormValuesViewModel創建起來非常昂貴,您可以將它的值作爲隱藏字段添加到表單中,或者實現與應用程序或會話狀態一起工作的自定義ValueProviderFactory

+1

謝謝!我現在知道了。 – Marc