在MVC中创建一个仍然填充支持它的模型的DropDownList

时间:2017-10-11 21:55:37

标签: c# asp.net-mvc

我有一个名为GoalTypes的小模型,其中包含“跑步,骑自行车,重量......”等内容。

public class GoalType
{
    public int Id { get; set; }
    public string Type { get; set; }
}

我还有一个名为Goals的模型   公共课目标 {     public int Id {get;组; }

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime StartDate  { get; set; }

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public  DateTime? EndDate { get; set; }

public string Type { get; set; }
public double Level { get; set; }

} 类型字段将由GoalTypes中的Type字段填充。 在我的目标控制器中,我做了:

public ActionResult Create()
{
    ViewBag.listOfGoals = new SelectList(db.GoalTypes, "Id", "Type");
    return View();
}

在我看来

<div class="form-group">
    @Html.LabelFor(model => model.Type, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownList("listOfGoals", "Select a Goal")
        @Html.ValidationMessageFor(model => model.Type, "", new { @class = "text-danger" })
    </div>
</div>

这会填充下拉列表但如果我提交,则类型字段会留空

2 个答案:

答案 0 :(得分:-1)

您必须将@ViewBag传递给@ Html.DropDownList,如下所示:

@Html.DropDownList("listOfGoals", ViewBag.listOfGoals)

或创建一个帮手:

public class MyHelpers{
   public static SelectList DropDownListGoalTypes(int? selected) {
        var list = db.GoalType.ToList();
        return new SelectList(list, "Id", "Type", selected);
   } 
 } 

查看:

@Html.DropDownListFor(x => x.Id, MyHelpers.DropDownListGoalTypes(Model.Id))

答案 1 :(得分:-1)

@Html.DropDownList("listOfGoals", "Select a Goal")生成一个这样的select元素:

<select name="listOfGoals" id="listOfGoals"></select> 

但是您在提交时尝试将下拉列表绑定到模型中的Type属性,

因此,您需要将其更改为:

@Html.DropDownListFor(model => model.Type, (IEnumerable<SelectListItem>)ViewBag.listOfGoals, "Select a Goal")

@Html.DropDownListFor("Type", (IEnumerable<SelectListItem>)ViewBag.listOfGoals, "Select a Goal")

现在,select创建时name属性为“类型”,DefaultModelBinder可以将其绑定到POST操作中的属性。

此外,正如斯蒂芬建议的那样,您需要将Type更改为int。因为提交了所选value的{​​{1}},而不是文字。

option