2013-10-15 111 views
0

我有一個問題與MVC(新來的,來自MVVM在WPF中)。MVC模型失去約束

我在我的cshtml文件中有一個組合框,讓用戶從列表中選擇一個國家。但是,在我的模型中,當我嘗試從列表中獲取國家時,集合爲空。

<div class="inputs"> 
    @Html.LabelFor(model => model.SelectedCountry) 
    <div class="input-box"> 
     @Html.DropDownListFor(model => model.CountryID, Model.AvailableCountries) 
    </div> 
    @Html.ValidationMessageFor(model => model.SelectedCountry) 
</div> 

正如你所看到的,我將選定的值綁定到CountryID。在我的模型中,我使用此CountryID從國家/地區列表中獲取名稱,並將SelectedCountry字符串設置爲用戶選擇的任何內容。

問題是,當我嘗試從我的模型列表中獲取國家列表爲空。

在我的模型的國家名單:

public IList<SelectListItem> AvailableCountries 
{ 
    get 
    { 
     if (_availableCountries == null) 
      _availableCountries = new List<SelectListItem>(); 
     return _availableCountries; 
    } 
    set 
    { 
     _availableCountries = value; 
    } 
} 

和國家的在我的控制器列表中的人口。

foreach (var c in _countryService.GetAllCountries()) 
{ 
    model.AvailableCountries.Add(new SelectListItem() { Text = c.Name, Value = c.Id.ToString() }); 
} 

也爲您在CSHTML看到,值綁定到CountryIID和該屬性的代碼是:

public int CountryID 
{ 
    get 
    { 
     return _countryID; 
    } 
    set 
    { 
     if (_countryID != value) 
     { 
      _countryID = value; 
      List<SelectListItem> _list = new List<SelectListItem>(AvailableCountries); 
       SelectedCountry = _list.Find(x => x.Value == _countryID.ToString()).Text; 
     } 
    } 
} 

/彼得

+0

這只是視圖,底層邏輯在哪裏? – walther

+0

我看不到列表? – MUG4N

回答

1

您的dropdownlistfor結合是不妥當的。

假設您提供的字段名稱的值將被Razor引擎綁定到下拉列表中,您需要提供要在下拉列表中綁定的屬性名稱。嘗試了這一點

@Html.DropDownListFor(model => model.ActionId, new SelectList(@Model.AvailableCountries,"AccountID","AccountName")) 

其中ACCOUNTID,帳戶名是內AvailableCountries屬性字段,其中帳戶名值將顯示在頁面上,並ACCOUNTID將在選擇進行綁定。

希望這有助於...

+0

就像你可以在我上面更新的帖子中看到的那樣,上面的列表中的項目實際上是SelectListItems,所以它們被標準映射。 –

0

通過照顧CountryId,並在我的控制器翻譯它,而不是解決問題。 然後,只需重新填充AvailableCountries列表,如果模型無效並將其發送回視圖。

+0

這正是你應該照顧它的方式。由於網絡的無狀態性,來自MVVM/WPF可能會有點困難。一旦您提供視圖(填充數據),如果您發佈數據並且ModelState無效,則需要手動重新填充下拉列表,因爲該信息不會與POST一起回傳。 – Fran