包含Razor语句的MvcHtmlString

包含Razor语句的MvcHtmlString,razor,asp.net-mvc-5,Razor,Asp.net Mvc 5,我发现自己经常重复这个代码块 <div class="form-group"> <div class="col-sm-3 control-label"> @Html.LabelFor(m => m.Name) </div> <div class="col-sm-9"> @Html.TextBo

我发现自己经常重复这个代码块

        <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>

您无法以您尝试的方式调用HTML帮助程序。它所要做的就是将其作为文本输出,输出您已经看到的结果

相反,您需要按照以下内容引用HTML帮助程序:

string yourString = "Your string " + helper.LabelFor("text", "actionName");

您无法以您尝试的方式调用HTML帮助程序。它所要做的就是将其作为文本输出,输出您已经看到的结果

相反,您需要按照以下内容引用HTML帮助程序:

string yourString = "Your string " + helper.LabelFor("text", "actionName");

您的助手需要使用内置的助手方法来生成html。比如说

MvcHtmlString label = LabelExtensions.LabelFor(helper, expression});

用于创建输出类似html的帮助器,包括标签、文本框和验证消息。

帮助器需要使用内置的帮助器方法生成html。比如说

MvcHtmlString label = LabelExtensions.LabelFor(helper, expression});

用于创建输出类似html(包括标签)的帮助器,文本框和验证消息。

部分视图或应用程序/本地帮助程序如何?部分视图或应用程序/本地帮助程序如何?我必须向Stephen说明,因为他的链接非常有用。我必须向Stephen说明,因为他的链接非常有用。