2

在使用 MVC 5.1 中的新Html.EnumDropDownListFor扩展方法时,我遇到了一个问题,即所选值没有根据我传递给控制器​​操作的路由属性在下拉列表中更新。

看法

@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属性,则下拉菜单不会在呈现时更新为属性值——即使我已经确认该属性确实具有默认枚举值以外的值.

4

3 回答 3

6

I too encountered this problem today. Renaming the routes parameter to a name different from the models property worked for me.

Controller Action

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

    return View(new EnvironmentsModel{Environment = env});
}
于 2014-05-06T17:06:49.577 回答
1

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

     @Html.DropDownListFor(m => m.Environment, Enum.GetValues(typeof(YourEnumType)).Cast<YourEnumType>().Select(x => new SelectListItem { Text = x.ToString(), Value = ((int)x).ToString() }))
于 2014-04-07T12:57:13.287 回答
0

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

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

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

因为控制器将枚举绑定到 int 你需要将它作为整数传递,所以我将视图更改为下一个(工作):

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

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

于 2016-08-04T10:32:46.963 回答