MvcHtmlString с включенными инструкциями Razor
Я повторяю этот блок кода слишком часто...
<div class="form-group">
<div class="col-sm-3 control-label">
@Html.LabelFor(m => m.Name)
</div>
<div class="col-sm-9">
@Html.TextBoxFor(m => m.Name, null, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Name)
</div>
</div>
Я пытался создать собственное расширение MvcHtmlString, но предполагается, что команды @Html.LabelFor являются текстовыми, и именно это отображается.
РЕДАКТИРОВАТЬ: Спасибо, Джо и Стивен! Вот чего мне не хватало.
Вот окончательный ответ для моего блока кода
static MvcHtmlString BaseFieldFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, string>> expression, MvcHtmlString innerHtml, string style = null) {
var labelDiv = new TagBuilder("div");
labelDiv.AddCssClass("col-sm-3 control-label");
labelDiv.InnerHtml += helper.LabelFor(expression, new {
htmlAttributes = new { @class = "form-control" }
});
var textDiv = new TagBuilder("div");
textDiv.AddCssClass("col-md-9");
textDiv.InnerHtml += innerHtml;
textDiv.InnerHtml += helper.ValidationMessageFor(expression);
var groupDiv = new TagBuilder("div");
groupDiv.AddCssClass("form-group");
groupDiv.InnerHtml += labelDiv;
groupDiv.InnerHtml += textDiv;
return new MvcHtmlString(groupDiv.ToString(TagRenderMode.Normal));
}
и для использования
public static MvcHtmlString FieldFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, string>> expression, string style = null) {
var innerHtml = helper.TextBoxFor(expression, null, new { @class = "form-control", style });
return BaseFieldFor(helper, expression, innerHtml, style);
}
public static MvcHtmlString DropDownListFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, string>> expression, IEnumerable<SelectListItem> list, string style = null){
var innerHtml = helper.DropDownListFor(expression, new SelectList(list, "Value", "Text"), new { @class = "form-control", style });
return BaseFieldFor(helper, expression, innerHtml, style);
}
И теперь я могу использовать это просто!
<div class="panel-body form-horizontal">
@Html.FieldFor(m => m.Name)
@Html.FieldFor(m => m.Address1)
@Html.FieldFor(m => m.Address2)
@Html.FieldFor(m => m.City)
@Html.DropDownListFor(m => m.State, AllowableValues.StateList, "max-width: 200px;")
@Html.FieldFor(m => m.PostalCode, "max-width: 150px;")
@Html.FieldFor(m => m.Phone, "max-width: 150px;")
</div>
2 ответа
Ваш помощник должен использовать встроенные вспомогательные методы для генерации вашего HTML. Например
MvcHtmlString label = LabelExtensions.LabelFor(helper, expression});
Обратитесь к этому примеру для создания помощника, который выводит аналогичный HTML, включая метку, текстовое поле и сообщение проверки.
Вы не можете вызвать помощников HTML так, как вы пытаетесь это сделать. Все, что он будет делать, это рассматривать его как вывод текста, как вы уже видели.
Вместо этого вам нужно сослаться на HTML-помощник по следующим строкам:
string yourString = "Your string " + helper.LabelFor("text", "actionName");