使用视图模型属性填充一个下拉列表:MVC 5,Razor [英] Populate a drop down list with view model property: MVC 5, Razor

查看:60
本文介绍了使用视图模型属性填充一个下拉列表:MVC 5,Razor的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有一些属性的视图,并想为其创建一个下拉框.到目前为止,我已经在控制器上创建了一个selectListItems列表,并为其添加了值,此刻,它可以正常工作并在下拉列表中显示项目.但是,我的问题是它根本没有链接到我在视图模型中拥有的属性.我该如何修改?

控制器:

  List< SelectListItem>Jobs = new List< SelectListItem>();SelectListItem job1 = new SelectListItem(){文本="Email",Value ="1",Selected = false};SelectListItem job2 = new SelectListItem(){文本="OtherJob",Value ="2",Selected = false};SelectListItem job3 = new SelectListItem(){文本="OtherJob2",Value ="3",Selected = false};SelectListItem job4 = new SelectListItem(){文本="OtherJob3",Value ="4",Selected = false};SelectListItem job5 = new SelectListItem(){文本="OtherJob4",Value ="5",Selected = false};SelectListItem job6 = new SelectListItem(){文本="OtherJob5",Value ="6",Selected = false};SelectListItem job7 = new SelectListItem(){文本="OtherJob6",Value ="7",Selected = false};SelectListItem job8 = new SelectListItem(){文本="OtherJob7",Value ="8",Selected = false};jobs.Add(job1);jobs.Add(job2);jobs.Add(job3);jobs.Add(job4);jobs.Add(job5);jobs.Add(job6);jobs.Add(job7);jobs.Add(job8);ViewBag.jobs =工作;返回View(); 

ViewModel:

 公共对象Job {get;放;} 

查看:

  @using(Html.BeginForm(FormMethod.Post)){< center>< div class ="form-group">@ Html.DropDownList("jobs",(IEnumerable< SelectListItem>)ViewBag.jobs)</div></center> 

解决方案

您传递给 DropDownList name 参数是错误的.要正确绑定,应与viewmodel属性名称相同:

  @ Html.DropDownList("Job",(IEnumerable< SelectListItem>)ViewBag.jobs) 

由于您具有强类型的视图模型,因此最好使用 DropDownListFor 帮助器并将相应的viewmodel属性类型更改为与 SelectListItem.Value 属性类型相同.另外,您还可以使用类型为 IEnumerable< SelectListItem> 的属性来消除 ViewBag 使用中的类型转换,并将其直接分配给 DropDownListFor :

模型

 公共类ViewModel{public int Job {获取;放;}公共列表< SelectListItem>乔布斯{get;放;}} 

控制器

  [HttpGet]公共ActionResult ControllerName(){var model = new ViewModel();model.Jobs = new List< SelectListItem>();model.Jobs.Add(new SelectListItem(){Text ="Email",Value ="1",Selected = false});//在此处分配其他SelectListItem列表值返回View(model);} 

查看

  @model ViewModel@using(Html.BeginForm("ActionName","ControllerName",FormMethod.Post)){< div style ="text-align:center">< div class ="form-group">@ Html.DropDownListFor(m => m.Job,Model.Jobs)</div></div>} 

I've got a view with a few properties and want to create a drop down box for it. So far, I've created a list of selectListItems on my controller and added values to it and at the moment, it works and displays the items in the drop down list. However, my problem is that it's not linked at all to the property I have in my view model. How can I amend this?

controller:

            List<SelectListItem> jobs = new List<SelectListItem>();
        SelectListItem job1 = new SelectListItem() { Text = "Email", Value = "1", Selected = false };
        SelectListItem job2 = new SelectListItem() { Text = "OtherJob", Value = "2", Selected = false };
        SelectListItem job3 = new SelectListItem() { Text = "OtherJob2", Value = "3", Selected = false };
        SelectListItem job4 = new SelectListItem() { Text = "OtherJob3", Value = "4", Selected = false };
        SelectListItem job5 = new SelectListItem() { Text = "OtherJob4", Value = "5", Selected = false };
        SelectListItem job6 = new SelectListItem() { Text = "OtherJob5", Value = "6", Selected = false };
        SelectListItem job7 = new SelectListItem() { Text = "OtherJob6", Value = "7", Selected = false };
        SelectListItem job8 = new SelectListItem() { Text = "OtherJob7", Value = "8", Selected = false };
        jobs.Add(job1);
        jobs.Add(job2);
        jobs.Add(job3);
        jobs.Add(job4);
        jobs.Add(job5);
        jobs.Add(job6);
        jobs.Add(job7);
        jobs.Add(job8);
ViewBag.jobs = jobs;

        return View();

ViewModel:

public object Job { get; set; }

View:

    @using (Html.BeginForm(FormMethod.Post))
{
    <center>
        <div class="form-group">
            @Html.DropDownList("jobs", (IEnumerable <SelectListItem>)ViewBag.jobs)
        </div>
    </center>

解决方案

Your name argument passed to DropDownList is wrong. It should be same as viewmodel property name to bind properly:

@Html.DropDownList("Job", (IEnumerable<SelectListItem>)ViewBag.jobs)

Since you have strongly-typed viewmodel, better to use DropDownListFor helper and change corresponding viewmodel property type to be same as SelectListItem.Value property type. Also you can eliminate cast from ViewBag usage by using a property which has type of IEnumerable<SelectListItem> and assign it directly to DropDownListFor:

Model

public class ViewModel
{
    public int Job { get; set; }

    public List<SelectListItem> Jobs { get; set; }
}

Controller

[HttpGet]
public ActionResult ControllerName()
{
    var model = new ViewModel();
    model.Jobs = new List<SelectListItem>();
    model.Jobs.Add(new SelectListItem() { Text = "Email", Value = "1", Selected = false });

    // assign other SelectListItem list values here

    return View(model);
}

View

@model ViewModel

@using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post)) 
{
    <div style="text-align:center">
        <div class="form-group">
            @Html.DropDownListFor(m => m.Job, Model.Jobs)
        </div>
    </div>
}

这篇关于使用视图模型属性填充一个下拉列表:MVC 5,Razor的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆