【问题标题】:Populate a drop down list with view model property: MVC 5, Razor使用视图模型属性填充下拉列表:MVC 5,Razor
【发布时间】:2018-04-27 15:29:56
【问题描述】:

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

控制器:

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

视图模型:

public object Job { get; set; }

查看:

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

【问题讨论】:

  • @Html.DropDownListFor(m =&gt; m.Job, (IEnumerable&lt;SelectListItem&gt;)ViewBag.jobs) - 和 Job 的类型应该是 int,而不是 object

标签: asp.net-mvc object razor drop-down-menu viewmodel


【解决方案1】:

您传递给DropDownListname 参数是错误的。它应该与视图模型属性名称相同才能正确绑定:

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

既然你有强类型的视图模型,最好使用DropDownListFor 助手并将相应的视图模型属性类型更改为与SelectListItem.Value 属性类型相同。您还可以通过使用类型为IEnumerable&lt;SelectListItem&gt; 的属性来消除ViewBag 使用中的强制转换并将其直接分配给DropDownListFor

型号

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

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

控制器

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

查看

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

【讨论】:

  • 我得到错误 'IEnumerable' does not contain a definition for 'Add' and no extension method 'Add' accept the first argument of type 'IEnumerable' 当我尝试你的代码。所以IEnumberable不能使用Add()方法
  • 很抱歉给出错误的模型定义。 IEnumerable 类型确实不包含 Add 方法,但 List&lt;T&gt; 包含。我修改了模型定义以适应您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多