2016-10-27 58 views
-1

我有一些問題與我的dropdownlist的默認值時,返回我的模型查看一個或多個錯誤的情況下。我在視圖中有一個下拉列表,它由控制器填充,其他列表中的空白下拉列表在同一視圖中,在選擇第一個下拉列表時填充了JSON。返回模型以查看與selectlistitem錯誤的默認值

public ActionResult Countriesdata() 
    {  
    CountrydetailsViewModel vm= new CountrydetailsViewModel(); 
     vm.countries= dal.countries().Select(x => new SelectListItem { Text = x.Name, Value = x.CountryID.ToString() }) 
           .ToList(); 
    return View(vm); 
    } 

這裏,dal是我的數據訪問層,允許我從數據庫中填充國家列表。代碼中使用,以填補在視圖中的國家名單是這樣

@Html.DropDownListFor(m => m.selectedcountry, new SelectList(Model.countries, "Value", "Text", Model.selectedcountry), "-Select a Country-", new { @class = "ddlist" }) 

空dropdowlists之一是如下

@Html.DropDownListFor(m => m.selectedtown, new SelectList(Enumerable.Empty<SelectListItem>(), "Value", "Text", Model.selectedtown), "-Select a Town/City-", new { @class = "ddlist" }) 

此代碼的工作非常好我到達頁面的第一個因爲我已經爲選擇國家的國家/地區dropdownlist設置了默認值。我使用下面的代碼發佈我的表單。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Countriesdata(CountrydetailsViewModel returnmodel) 
    {  
    if (! ModelState.IsValid) 
     { 
    returnmodel.countries= dal.countries().Select(x => new SelectListItem { Text = x.Name, Value = x.CountryID.ToString() }) 
           .ToList(); 
    return View(returnmodel); 
     } 
     return RedirectToAction("mainpage"); 
    } 

如果表單包含錯誤,我的模型返回到我的觀點與國家發佈的價值選擇下拉列表默認,這不是我的目標,因爲別人dropdowlists這些都對國家下拉列表使用JSON填寫選擇變化是空的。因此,我應該選擇這個國家一次來填補其他的dropdowlists,這很麻煩。爲了邏輯起見,我想發回我的模型到我的視圖,默認值爲發生錯誤時的國家下拉列表。我正在使用MVC4和VS 2010

回答

1

您需要在控制器方法中填充這兩個SelectList以便它們傳遞給視圖。在GET方法中,第二個將是一個空的SelectList(假設它是'Create'metod),但在POST方法中,它將根據所選國家進行填充。

你的模型應該包括

public class CountrydetailsViewModel 
{ 
    [Required(Error Message = "..")] 
    public int? SelectedCountry { get; set; } 
    [Required(Error Message = "..")] 
    public int? SelectedTown { get; set; } 
    .... 
    public IEnumerable<SelectListItem> CountryList{ get; set; } 
    public IEnumerable<SelectListItem> TownList { get; set; } 
} 

而且你的控制器方法

public ActionResult Countriesdata() 
{ 
    CountrydetailsViewModel vm = new CountrydetailsViewModel(); 
    ConfigureViewModel(vm); 
    return View(vm); 
} 
[HttpPost] 
public ActionResult Countriesdata(CountrydetailsViewModel returnmodel) 
{ 
    if(!ModelState.IsValid) 
    { 
     ConfigureViewModel(returnmodel); 
     return View(returnmodel); 
    } 
    .... // save and redirect 
} 
private ConfigureViewModel(CountrydetailsViewModel model) 
{ 
    var countries = dal.countries(); 
    model.CountryList= countries.Select(x => new SelectListItem 
    { 
     Text = x.Name, 
     Value = x.CountryID.ToString() 
    }); 
    if (model.SelectedCountry.HasValue) 
    { 
     // adjust query to suit your property names 
     var towns = db.towns.Where(e => e.CountryId == model.SelectedCountry); 
     model.TownList = towns.Select(x => new SelectListItem 
     { 
      Text = x.Name, 
      Value = x.TownID.ToString() 
     }); 
    } 
    else 
    { 
     model.TownList = new SelectList(Enumerable.Empty<SelectListItem>()); 
    } 
} 

這也讓你產生正確的選項默認選擇編輯現有CountrydetailsViewModel時。

然後在視圖中,使用

@Html.DropDownListFor(m => m.SelectedCountry, Model.CountryList, "-Select a Country-", new { @class = "ddlist" }) 
@Html.ValidationMessageFor(m => m.SelectedCountry) 

@Html.DropDownListFor(m => m.SelectedTown, Model.TownList, "-Select a Country-", new { @class = "ddlist" }) 
@Html.ValidationMessageFor(m => m.SelectedTown) 

注意,沒有一點從你傳遞給視圖使用new SelectList(..)原來創建一個相同SelectList - 它只是不必要的額外的開銷。還要注意的是,當您綁定到model屬性(在內部,該方法根據屬性的值自行構建SelectList)時,SelectList構造函數中的最後一個參數將被忽略 - 您可以將任何想要的值作爲最後一個參數,您將請參閱根據屬性的值選擇的選項仍然正確。

+0

+1 @Stephen Muecke,我已經根據自己的需要實現了你的代碼,它像一個魅力一樣走路。非常感謝 –

+0

那麼也許你應該考慮接受答案來解決這個問題(以及其他答案給你的問題,包括你自己解決問題的答案) –