我试图创建一个项目编辑屏幕,用户可以在其中设置Item的属性ItemType。理想情况下,当用户返回到屏幕时,下拉列表将显示已与项目关联的ItemType。
实际上,无论item.ItemType是什么,下拉列表都不会反映下拉列表中的内容。有没有解决的办法?
作为参考,目前我的代码是:
<div class="form-group">
@Html.LabelFor(model => model.ItemType, new { @class = "control-label col-xs-4" })
<div class="col-xs-8">
@Html.DropDownListFor(model => model.ItemType, (SelectList)ViewBag.ItemType, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.ItemType, String.Empty, new { @class = "text-danger" })
</div>
</div>
ViewBag设置如下:
var ItemType = Enum.GetValues(typeof(ItemType));
ViewBag.ItemType = new SelectList(ItemType);
答案 0 :(得分:2)
如果您正在使用ASP.NET MVC 5,请尝试使用EnumHelper.GetSelectList
方法。那你就不需要ViewBag.ItemType。
@Html.DropDownListFor(model => model.ItemType, EnumHelper.GetSelectList(typeof(ItemType)), new { @class = "form-control" })
如果没有,您可能需要指定选择列表的数据值和数据文本字段。
var itemTypes = (from ItemType i in Enum.GetValues(typeof(ItemType))
select new SelectListItem { Text = i.ToString(), Value = i.ToString() }).ToList();
ViewBag.ItemType = itemTypes;
然后,因为它是IEnumerable<SelectListItem>
你需要改变你的演员阵容。
@Html.DropDownListFor(model => model.ItemType, (IEnumerable<SelectListItem>)ViewBag.ItemType, new { @class = "form-control" })
答案 1 :(得分:1)
最终我找到了一个修复 - 手动创建列表。
CREATE FUNCTION IsNumeric (input varchar(1024)) RETURNS int
RETURN input REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';
答案 2 :(得分:1)
尝试在视图和控制器之外保留尽可能多的逻辑。
我在你自己的回答中看到,你的控制器中有一个从中选择的枚举。
我的一个应用程序中有一个DropDownList,其中包含一个Enums列表。它还具有选定的默认值,但也具有用户可用的特定枚举。可以在控制器中设置默认选择。
此示例基于我的需求,因此您需要适应您的情况。
在控制器中:
Model2
在视图中:
public ActionResult Index()
{
ViewBag.NominationStatuses = GetStatusSelectListForProcessView(status)
}
private SelectList GetStatusSelectListForProcessView(string status)
{
var statuses = new List<NominationStatus>(); //NominationStatus is Enum
statuses.Add(NominationStatus.NotQualified);
statuses.Add(NominationStatus.Sanitized);
statuses.Add(NominationStatus.Eligible);
statuses.Add(NominationStatus.Awarded);
var statusesSelectList = statuses
.Select(s => new SelectListItem
{
Value = s.ToString(),
Text = s.ToString()
});
return new SelectList(statusesSelectList, "Value", "Text", status);
}
此方法会自动将默认项目设置为在控制器中选择的枚举。