Html.EnumDropDownList表示未将属性值显示为已选中

时间:2014-04-07 12:50:15

标签: asp.net asp.net-mvc razor asp.net-mvc-5 asp.net-mvc-5.1

在MVC 5.1中使用新的Html.EnumDropDownListFor扩展方法时,我遇到了一个问题,即所选值不会根据路由属性I'而在下拉列表中进行更新。 m传递给我的控制器动作。

查看

@model MemberReconWebDemo.Models.EnvironmentsModel
@{
    ViewBag.Title = "Environments";
}

<h2>Environments</h2>
<div class="row">
    <div class="col-md-12">
        @Html.EnumDropDownListFor(p => p.Environment)
        @Model.Environment.ToString()
    </div>
</div>

控制器操作

[Route("environments/{environment?}")]
public ActionResult Environments(string environment)
{
    Domain.Environment env;
    Enum.TryParse(environment, true, out env);

    return View(new EnvironmentsModel{Environment = env});
}

如果我导航到没有可选属性的路由,并且我在控制器操作中将Model.Environment属性设置为静态值,则该选定值显示没有问题。

如果我传入一个有效的路由属性值,将其分配给Model.Environment属性,则在渲染时下拉列表不会更新为属性值 - 即使我已经确认该属性的值不是默认的枚举值。

3 个答案:

答案 0 :(得分:6)

我今天也遇到了这个问题。将routes参数重命名为与models属性不同的名称。

控制器操作

[Route("environments/{envparm?}")]
public ActionResult Environments(string envparam)
{
    Domain.Environment env;
    Enum.TryParse(envparam, true, out env);

    return View(new EnvironmentsModel{Environment = env});
}

答案 1 :(得分:0)

你应该试试这个: 使用Html.DropdownlistFor

     @Html.DropDownListFor(m => m.Environment, Enum.GetValues(typeof(YourEnumType)).Cast<YourEnumType>().Select(x => new SelectListItem { Text = x.ToString(), Value = ((int)x).ToString() }))

答案 2 :(得分:0)

我遇到过类似的错误。在我的情况下,我需要通过动作链接传递枚举值,如下所示(不工作):

enum GroupByDate {
    Day, Month
}
class IndexViewModel {
    GroupByDate GroupByDate;
}

<a href="@Url.Action("Index", new IndexViewModel { GroupByDate = DateGroup.Month})">...</a>

因为控制器将枚举绑定到int,所以需要将其作为整数传递,因此我将视图更改为next(working):

 <a href="@Url.Action("Index", new { GroupByDate = (int) DateGroup.Month})">...</a>

请注意,该路由值不再是类型化的ViewModel,而是匿名类型。