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);
}
}
我认为最好的方法是使用一个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;