我有一些Enum
s的结构:
public Enum Title
{
Unknown = 0,
Mr = 1,
Mrs = 2,
...
Other = -1
}
public Enum Title
{
Unknown = 0,
Mr = 1,
Mrs = 2,
...
Other = -1
}
public enum MaritialStatus
{
Unspecified = 0,
Single = 1,
Married = 2,
Separated = 3,
Divorced = 4,
...
Other = -1
}
还有其他一些人。所有这些都映射到实体框架属性和相关的“其他”属性:
public PersonEnums.Title Title { get; set; }
public string TitleOther { get; set; }
public string GetTitle => Title == PersonEnums.Title.Other ? TitleOther : Title.ToString();
现在,对于视图,我不确定将这些组合成一个控件/部分/编辑器模板的最简洁/最简单的方法吗?
我试过了:
添加视图模型:
public class EnumWithOtherViewModel
{
public Enum Enum { get; set; }
public string OtherValue { get; set; }
}
部分
@Html.Partial("_EnumWithOther", new EnumWithOtherViewModel { Enum = Model.Title, OtherValue = Model.TitleOther })
_EnumWithOther.cshtml
@model RS3.Models.EnumWithOtherViewModel
@Html.EnumDropDownListFor(m => m.Enum, new { @class = "form-control EnumWithOther" })
@Html.EditorFor(m => m.OtherValue)
我收到以下错误 返回类型'System.Enum'不支持。 位于部分<{p>}行
显示模板
@Html.EnumDropDownListFor()
EnumWithOther.cshtml
@Html.EditorFor(m => new EnumWithOtherViewModel { Enum = m.Title, OtherValue = m.TitleOther })
我收到以下错误 模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。 @model EnumWithOtherViewModel
<div class="form-group">
@Html.LabelFor(m => m, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EnumDropDownListFor(m => m.Enum, new { @class = "form-control EnumWithOther" })
@Html.ValidationMessageFor(m => m.Enum, "", new { @class = "text-danger" })
@Html.EditorFor(m => m.OtherValue)
</div>
</div>
关于如何最好地将通用EditorFor
转换为某种模板以及Enum
其他值,我有点迷失方向。什么是为这种设置重复使用的最佳方法?
显示和隐藏“其他”框的javascript是微不足道的,它只是让所有内容正确映射回EF,我坚持使用。
答案 0 :(得分:0)
感谢@ngm让我走上了正确的道路。最干净的方式是使用HTML帮助程序。
public static MvcHtmlString EnumWithOther<TModel, TEnum>(this HtmlHelper<TModel> html, TEnum e, string other)
{
string r = string.Empty; // Setup the return holder
string label = e.GetType().Name; // Get the name of the Enum for the ID's
r += html.EnumDropDownListFor(m => e, new { @id = label, @Name = label, @class = "form-control EnumWithOther" }); // Setup the dropdown for the enum
r += html.TextBoxFor(m => other, new { @id = $"{label}Other", @Name = $"{label}Other" }); //Setup the textbox for other
return new MvcHtmlString(r);
}
所以我可以在我的Razor视图中使用:
@Html.EnumWithOther(Model.Title, Model.TitleOther)
帮助会将输出HTML的默认id
和name
属性覆盖为正确的值,以便在提交时正确发布和映射表单。
此时,您仍然需要处理JavaScript部分以根据需要显示和隐藏“其他”文本框。