2013-12-20 32 views
1

我有這樣一個模型:從下拉式在查看並回傳給控制器

public class UserProfile 
{ 
    public Guid ID { get; set; } 
    public string DisplayName { get; set; } 
    public Language PreferredLang { get; set; } 
} 
public class Language 
{ 
    [Key] 
    public int LanguageID { get; set; } 
    public string LanguageCode { get; set; } 
    public string DisplayName { get; set; } 
} 

而且我希望能夠從下拉列表中選擇首選語言。

在控制器中,我得到語言列表並將其放入ViewBag中。鑑於我加載此列表。然後我想保存選擇。

我的控制器:

public ActionResult EditProfile() 
{ 
    List<Language> langauges = Logic.GetAllLanguages(); 
    ViewBag.Languages = langauges; 
    UserProfile profile = GetUserProfile(); 
    return View(profile); 
} 

一個我的觀點:

@using (Html.BeginForm()) { 

    @Html.EditorFor(model => model.DisplayName) 
    <div class="display-field"> 
     @Html.DropDownListFor(x => x.PreferredLang, new SelectList(ViewBag.Languages, "LanguageID", "DisplayName") as SelectList) 

    </div> 
    <input type="submit" value="Save" /> 
} 

當用戶點擊 「保存」,傳遞給控制器​​element對象有DisplayName,但PreferredLang始終爲空。 如何將語言傳遞迴控制器?

[HttpPost] 
public ActionResult EditProfile(UserProfile element) 
{ 
    //save element 
} 
+0

MVC有本地化的大力支持,沒有必要寫你自己的語言選擇的東西:http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx HTTP:/ /geekswithblogs.net/shaunxu/archive/2010/05/06/localization-in-asp.net-mvc-ndash-3-days-investigation-1-day.aspx – MrFox

+0

這不是關於本地化,該類可以是其他任何東西。 – Tschareck

回答

3

具有以下屬性創建一個視圖模型:

UserProfileViewModel

public class UserProfileViewModel 
{ 
    public Guid ID { get; set; } 
    public string DisplayName { get; set; } 
    public int PreferredLangID { get; set; } 
    public IEnumerable<Language> PreferredLanguages { get; set; } 
} 

查看

@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(model => model.ID) 
    @Html.EditorFor(model => model.DisplayName) 
    <div class="display-field"> 
     @Html.DropDownListFor(x => x.PreferredLangID, new SelectList(Model.PreferredLanguages, "LanguageID", "DisplayName")) 
    </div> 
    <input type="submit" value="Save" /> 
} 

控制器

public ActionResult EditProfile() 
{ 
    List<Language> languages = Logic.GetAllLanguages(); 
    UserProfile profile = GetUserProfile(); 
    var viewModel = new UserProfileViewModel 
     { 
      ID = profile.ID, 
      DisplayName = profile.DisplayName, 
      PreferredLanguages = languages 
     }; 
    return View(viewModel); 
} 

[HttpPost] 
public ActionResult EditProfile(UserProfileViewModel viewModel) 
{ 
    List<Language> languages = Logic.GetAllLanguages(); 
    if(ModelState.IsValid) 
    { 
     var userProfile = new UserProfile 
      { 
       ID = viewModel.ID, 
       DisplayName = viewModel.DisplayName, 
       PreferredLang = languages.FirstOrDefault(l => l.LanguageID == viewModel.PreferredLangID) 
      }; 
     //save element 
    } 
    viewModel.PreferredLanguages = languages; 
    return View(viewModel); 
} 
+0

cshtml中的DropDownFor如何知道「LanguageID」的含義? –

+0

@NathanMcKaskle,「LanguageID」用於[DataValueField](https://msdn.microsoft.com/en-us/library/system.web.mvc.multiselectlist.datavaluefield(v = vs.118).aspx#P :System.Web.Mvc.MultiSelectList.DataValueField),它是'Language'類的屬性。 – Zabavsky

相關問題