用于枚举和文本框组合的MVC5部分或编辑器模板?

时间:2016-05-12 07:44:53

标签: c# asp.net-mvc razor enums asp.net-mvc-5.2

我有一些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,我坚持使用。

1 个答案:

答案 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的默认idname属性覆盖为正确的值,以便在提交时正确发布和映射表单。

此时,您仍然需要处理JavaScript部分以根据需要显示和隐藏“其他”文本框。