2013-10-15 81 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