MVC3 Razor扩展:返回两个控件

本文关键字:两个 控件 Razor 扩展 返回 MVC3 | 更新日期: 2023-09-27 18:15:23

我正在尝试创建一个呈现只读下拉列表的扩展。似乎只是在<select>元素上拍打readonly="true"属性不起作用,所以我想渲染一个禁用的<select>元素和一个隐藏的输入。

这是我目前为止的代码:

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression,
    IEnumerable<SelectListItem> selectList,
    object htmlAttributes,
    bool isReadonly)
{
    var values = new RouteValueDictionary(htmlAttributes);
    if (isReadonly) values["disabled"] = "disabled";
    var select = htmlHelper.DropDownListFor<TModel, TProperty>(expression, selectList, values);
    var hiddenField = htmlHelper.HiddenFor<TModel, TProperty>(expression);
    var bothFields = ?;
    return bothFields;
}

从Razor扩展中呈现多个控件的正确方法是什么?

编辑:解决方案

明白了。显然,你可以在两个元素上调用ToString()并返回它。正如Jerad指出的那样,<select>的id必须被修改,所以它与隐藏输入的id不一样。最后的代码是这样的:

public static MvcHtmlString DropDownListFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression,
    IEnumerable<SelectListItem> selectList,
    object htmlAttributes,
    bool isReadonly)
{
    if (isReadonly)
    {
        var values = new RouteValueDictionary(htmlAttributes);
        values["disabled"] = "disabled";
        values["id"] = (expression.Body as MemberExpression).Member.Name + "_Disabled";
        var select = htmlHelper.DropDownListFor<TModel, TProperty>(expression, selectList, values);
        var hiddenField = htmlHelper.HiddenFor<TModel, TProperty>(expression);
        return new MvcHtmlString(select.ToString() + hiddenField.ToString());
    }
    else
    {
        return htmlHelper.DropDownListFor<TModel, TProperty>(expression, selectList, htmlAttributes);
    }
}

MVC3 Razor扩展:返回两个控件

我认为最好的方法是使用一个EditorTemplate来呈现这两个字段——从我所看到的w/HtmlHelper扩展来看,扩展方法通常返回一个HTML控件。

例如,在您的视图中:

@Html.EditorFor(m => m.SomeField, "ReadOnlyDropDown")

在你的编辑器模板中:

@Html.DropDownListFor(m => m, mySelectList, null, true)
@Html.HiddenFor(m => m)

同样,你最终会在你的表单上有冲突的名字,不是吗?看起来你的隐藏元素和选择元素都将以相同的名称呈现。

如果您真的想将两者合并为一个,我认为您可以简单地将两个HTML元素的结果连接起来,因为它们只是MvcHtmlString对象:

var bothFields = select + hidden;