【问题标题】:Show list of all Enums of type<T> except the one passed via lambda显示类型 <T> 的所有枚举列表,除了通过 lambda 传递的枚举
【发布时间】:2013-08-16 20:36:14
【问题描述】:

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

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

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

@Html.RadioButtonForEnum(model =&gt; 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());
}

【问题讨论】:

  • 旁白:我希望一个名为 RadioButtonForEnum 的方法为枚举中的每个项目创建一个单选按钮,很可能选择当前值。我建议重命名你的方法。

标签: c# asp.net-mvc


【解决方案1】:

类似

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

您需要模型实例来获取当前枚举值以避免,您可以通过使用HtmlHelper.ViewData.Model 如上所述在HtmlHelper 中获取它。

【讨论】:

    【解决方案2】:

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

    @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();
        ...
    

    【讨论】:

      【解决方案3】:

      快速而肮脏的方式:

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

      【讨论】:

        【解决方案4】:

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

        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-15
          • 2012-09-16
          • 2021-12-22
          相关资源
          最近更新 更多