MVC 3,调用此HTML的最佳方式

时间:2011-02-24 08:09:21

标签: asp.net-mvc asp.net-mvc-3

在MVC 3中创建一个站点,我有这个代码片段,我在设计的几个部分使用。这是一个为网站上的模块创建头部的设计代码。 现在想知道这是否是调用此代码段的最佳方式?我应该使用助手还是有更好的方法?

今天我喜欢这个:

    public static IHtmlString FrameModuleHeader(this HtmlHelper helper, int Type, string Headline)
    {
        StringBuilder html = new StringBuilder();
            html.Append("<div class='module_top'>");
                html.Append("<div class='module_top_left'></div>");
                html.Append("<div class='module_top_middle_" + Type + "'><div class='module_top_headline'><h4>" + Headline + "</h4></div></div>");
                html.Append("<div class='module_top_right'></div>");
            html.Append("</div>");
        return MvcHtmlString.Create(html.ToString());
    }

然后通过以下方式在视图中调用我的HTML帮助程序:

@ Html.FrameModuleHeader(1,“我的标题”)

谢谢! /麦克

4 个答案:

答案 0 :(得分:5)

我可能会使用部分视图或显示模板,而不是HTML帮助器,因为在C#代码中填充如此多的HTML看起来很难看。

例如,我会有一个视图模型:

public class SomeViewModel
{
    public int Type { get; set; }
    public string Headline { get; set; }
}

和部分:

@model AppName.Models.SomeViewModel

<div class="module_top">
    <div class="module_top_left"></div>
    <div class="module_top_middle_@(Model.Type)">
        <div class="module_top_headline">
            <h4>@Model.Headline</h4>
        </div>
    </div>
    <div class="module_top_right"></div>
</div>

然后:

@Html.Partial("Foo", new SomeViewModel { Type = 1, Headline = "My headline" })

这当然并不意味着您的HTML帮助程序不起作用。通常情况下,HTML助手应该用于生成HTML的小片段,在这个特定的例子中,似乎并非如此。如果在视图中使用,你可以获得HTML intellisense,这可能有助于你识别未封闭的标签,而不是格式正确的HTML,......而在C#中,一切都是一个很大的魔术字符串。

如果你决定使用它,最后要对你的HTML助手说一句:确保你 HTML编码这个Headline字符串,然后再将其放入字符串构建器中,否则你可能会得到不好的XSS惊喜。

答案 1 :(得分:0)

确实没有推荐的方法。你这样做的方式非常干净。所以我认为没有理由改变它。

答案 2 :(得分:0)

另一种选择是使用部分视图。您可以将它放在/ Views / Shared中,以便它可用于所有内容。这很好的一个原因是它可以更容易编辑而无需推出新的代码库。如果这个输出永远不会改变,那么可能没有必要。

答案 3 :(得分:0)

您当然可以通过删除不必要的html标记来解决由divitus引起的代码膨胀。

public static IHtmlString FrameModuleHeader(this HtmlHelper helper, int Type, string Headline)
{
    StringBuilder html = new StringBuilder();
        html.Append("<div class='module_top'>");
            html.Append("<h4 class='module_top_middle_" + Type + "'>" + HtmlEncode(Headline) + "</h4>");
        html.Append("</div>");
    return MvcHtmlString.Create(html.ToString());
}