Asp.net Html.EnumDropDownList用于不显示选定的属性值
在MVC 5.1中使用新的Asp.net Html.EnumDropDownList用于不显示选定的属性值,asp.net,asp.net-mvc,razor,asp.net-mvc-5,asp.net-mvc-5.1,Asp.net,Asp.net Mvc,Razor,Asp.net Mvc 5,Asp.net Mvc 5.1,在MVC 5.1中使用新的Html.EnumDropDownListFor扩展方法时,我遇到了一个问题,即所选值没有根据传递给控制器操作的路由属性在下拉列表中更新 查看 @model MemberReconWebDemo.Models.EnvironmentsModel @{ ViewBag.Title = "Environments"; } <h2>Environments</h2> <div class="row"> <div cl
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>
如果我导航到不带可选属性的路线,并且在控制器操作中将Model.Environment
属性设置为静态值,则所选值将显示为无问题
如果我传入了有效的路由属性值,请将其指定给
Model.Environment
属性,则在呈现时下拉列表不会更新为属性值--即使我已确认该属性确实具有默认枚举值以外的值。您应该尝试以下操作:
使用Html.DropdownlistFor
@Html.DropDownListFor(m => m.Environment, Enum.GetValues(typeof(YourEnumType)).Cast<YourEnumType>().Select(x => new SelectListItem { Text = x.ToString(), Value = ((int)x).ToString() }))
@Html.DropDownListFor(m=>m.Environment,Enum.GetValues(typeof(YourEnumType)).Cast().Select(x=>newselectListItem{Text=x.ToString(),Value=((int)x.ToString())
我今天也遇到了这个问题。将routes参数重命名为不同于models属性的名称对我很有效
控制器动作
[Route("environments/{environment?}")]
public ActionResult Environments(string environment)
{
Domain.Environment env;
Enum.TryParse(environment, true, out env);
return View(new EnvironmentsModel{Environment = env});
}
[Route("environments/{envparm?}")]
public ActionResult Environments(string envparam)
{
Domain.Environment env;
Enum.TryParse(envparam, true, out env);
return View(new EnvironmentsModel{Environment = env});
}
我也经历过类似的错误。在我的情况下,我需要通过操作链接传递枚举值,如下所示(不工作):
enum GroupByDate{
日月
}
类索引模型{
GroupByDate GroupByDate;
}
因为控制器将enum绑定到int,您需要将其作为整数传递,所以我将视图更改为next(工作):
请注意,路由值不再是类型化的ViewModel,而是匿名类型。为了检查modelstate是否不起作用,您检查了环境是否在modelstate中有值。这有时可能会导致问题,尤其是在POST中,etcModelState在渲染时确实有一个值,但未正确设置下拉选择值。我在下面使用了@user2086074的建议,这就像gangbusters一样有效,因此我们可以安全地排除ModelState。您的建议有效,但我试图找出为什么EnumDropDownListFor功能不能按预期工作,而不是如何从enum值的下拉列表中删除。我也遇到了同样的问题,正如@falseidols所暗示的,我发现如果变量名不同,问题就消失了。我有一个名为UserTitle的枚举和一个名为Title的ViewModel属性。这没有约束力。但是,如果我将属性重命名为其他名称中没有用户或标题的名称,那么它将按预期绑定。这也是我的问题所在。我的动作参数名为
region
,模型属性名为region
。我将action参数更改为regionParam
,它现在按预期工作。谢谢你,虚假偶像。
enum GroupByDate {
Day, Month
}
class IndexViewModel {
GroupByDate GroupByDate;
}
<a href="@Url.Action("Index", new IndexViewModel { GroupByDate = DateGroup.Month})">...</a>
<a href="@Url.Action("Index", new { GroupByDate = (int) DateGroup.Month})">...</a>