0

在我的 MVC 应用程序中,我创建了一个助手,它应该从模型中获取一个枚举,然后显示该类型的所有其他可用枚举的单选按钮。

例如,您有枚举 SatusActive, Inactive, Closed和页面的模型,Status = Status.Active因此您希望显示Inactive和的单选按钮Closed

继续这个例子,MVC 视图调用助手 RadioButtonForEnum:

@Html.RadioButtonForEnum(model => model.Status)

RadioButtonForEnum 然后获取该类型的所有枚举列表并将它们打印为单选按钮;但是,我不确定如何获取传递的枚举以将其排除在外names

public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
    var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    var names = Enum.GetNames(metaData.ModelType);
    var sb = new StringBuilder();
    foreach (var name in names)
    {
        var id = string.Format(
            "{0}_{1}_{2}",
            htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
            metaData.PropertyName,
            name
        );

        var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
        sb.AppendFormat("<label for=\"{1}\">{0}{2}</label>", radio, id, HttpUtility.HtmlEncode(StringHelpers.PascalCaseToSpaces(name)));
    }

    return MvcHtmlString.Create(sb.ToString());
}
4

4 回答 4

1

我不认为你有模型对象,原样。您可以将其添加为另一个参数:

@Html.RadioButtonForEnum(Model, model => model.Status)

public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, TModel model, Expression<Func<TModel, TProperty>> expression)
{
    string currentStatusName = expression.Compile()(model).ToString();
    ...
于 2013-08-16T20:46:49.010 回答
1

就像是

var modelValue = expression.Compile()(htmlHelper.ViewData.Model);
...
foreach (var name in names.Where(s => s != modelValue.ToString())
...

您需要模型实例来获取当前的枚举值以避免,您可以HtmlHelper通过使用HtmlHelper.ViewData.Model上面的方法来获取它。

于 2013-08-16T20:47:06.550 回答
0

快速而肮脏的方式:

foreach (var name in names)
{
    if (name == metaData.Model.ToString())
        continue;

    ...
}
于 2013-08-16T20:57:58.983 回答
0

在这里完全未经测试,因为我没有自己的电脑,但是将您的签名更改为:

public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Enum Status)

这将允许您传入 Status 枚举并询问其值:

public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Enum Status){
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var names = Enum.GetNames(metaData.ModelType);
        var sb = new StringBuilder();
        foreach (var name in names)
        {
            if (!name.Equals(Status.ToString()){
            var id = string.Format(
                "{0}_{1}_{2}",
                htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
                metaData.PropertyName,
                name
        );

        var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
        sb.AppendFormat("<label for=\"{1}\">{0}{2}</label>", radio, id, HttpUtility.HtmlEncode(StringHelpers.PascalCaseToSpaces(name)));
        }
}

你会从你的角度这样称呼它:

@Html.RadioButtonForEnum(model => model.Status, Model.Status)
于 2013-08-16T21:14:21.387 回答