创建一个类似于DropDownListFor的ASP.NET MVC Html帮助器

时间:2017-04-30 21:34:58

标签: asp.net-mvc html-helper mvc-editor-templates

在某些情况下,我想显示eval()对象不使用SelectList帮助器。相反,我想创建一个迭代SelectListItems的帮助器,并绘制不同的东西。

我创建了一个EditorTemplate:

DropDownListFor

@model RadioButtonOptions <div class=" switch-field noselect" style="padding-left: 0px;"> @foreach (SelectListItem op in Model.Values.Items) { var idLabelF = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "_" + op.Value; var esChecked = ""; if (op.Selected) { esChecked = "checked"; } <input type="radio" id="@idLabelF" name="@(ViewData.TemplateInfo.GetFullHtmlFieldName(""))" value="@op.Value" @esChecked /> <label for="@idLabelF" style="width: 100px;">@op.Text</label> } </div> 类是ViewModel:

RadioButtonOptions

最终结果如下:

enter image description here

我的ViewModel就像这样(简化):

public class RadioButtonOptions
    {
        public SelectList Values { get; set; }
    }

我在Razor View中使用它:

public class MainVisitVM
{
    public MainVisit Visit { get; set; }

    public RadioButtonOptions VisitOptions { get; set; }
}

我遇到的问题是我希望它更像DropDownListFor,所以我传递的lamda expresion是保存所选值的属性,然后只传递SelectList对象(或自定义列表)。

    <div class="clearfix">
        @Html.LabelFor(x=> x.Visit.Tipo)
        <div class="input">
            @Html.EditorFor(x=> x.VisitOptions ) //HERE
        </div>
    </div>

所以,我认为使用EditorTemplates这样做是不可能的。 如何实现这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

感谢@ StephenMuecke建议,我最终采用了这种HtmlHelper扩展方法:

public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(
           this HtmlHelper<TModel> htmlHelper,
           Expression<Func<TModel, TProperty>> expression,
           SelectList listOfValues)
        {

            string htmlFieldName = ExpressionHelper.GetExpressionText(expression);

            if (listOfValues == null) return MvcHtmlString.Create(string.Empty);

            var wrapperDiv = new TagBuilder("div");
            wrapperDiv.AddCssClass("switch-field noselect");
            wrapperDiv.Attributes.Add("style", "padding-left: 0px;");

            var sb = new StringBuilder();

            foreach (SelectListItem item in listOfValues)
            {
                var idLabelF = htmlFieldName.Replace(".","_") + "_" + item.Value;

                var label = htmlHelper.Label(idLabelF, item.Text, new { style = "width: 100px;" }).ToHtmlString();
                var radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = idLabelF }).ToHtmlString();

                sb.AppendFormat("{0}{1}", radio, label);
            }

            wrapperDiv.InnerHtml = sb.ToString();

            return MvcHtmlString.Create(wrapperDiv.ToString());
        } 

并不特别为我的htmlFieldName.Replace(".","_")感到骄傲,但却很有效。