本文介绍了从“视图"中的“下拉列表"中选择并传递回控制器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的模型:

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; }
}

而且我希望能够从下拉列表中选择首选语言.

And I want to be able to select preferred language from dropdown.

在控制器中,我获取语言列表并将其放在ViewBag中.在视图中,我加载了该列表.然后我要保存选择.

In controller I get list of languages and put it in ViewBag. In view I load this list. Then i want to save selection.

我的控制器:

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始终为空. 如何将语言传递回控制器?

When user clicks "Save", element object passed to controller has DisplayName, but PreferredLang is always null. How can I pass Language back to controller?

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

推荐答案

创建具有以下属性的ViewModel:

Create a ViewModel with following properties:

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);
}

这篇关于从“视图"中的“下拉列表"中选择并传递回控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-01 17:02