4

我有一个这样的助手,我在里面使用原始 HTML 创建了它,如下所示:

private static readonly Core Db = new Core();
        // Main menu
public static MvcHtmlString MainMenu()
{
    IQueryable<Page> primaryPages = Db.Pages.Where(p => p.IsItShowInMenu);
    var sb = new StringBuilder();
    sb.Clear();
     string pagecode = Convert.ToString(HttpContext.Current.Request.RequestContext.RouteData.Values["url"]);
    sb.Append("<div id=\"Logo\">");
    sb.Append("<a href=\"/\"><span id=\"Logo_Text\">Dr. Shreekumar</span></a> <span id=\"Logo_Sub_Text\">Obstetrician & Gynecologist</span>");
    sb.Append("</div>");
    sb.Append("<div id=\"Primary_Menu\">");
    sb.Append("<ul>");
    foreach (Page page in primaryPages)
    {
        if (page.PageCode != "Home")
        {
             Page currentPage = Db.Pages.SingleOrDefault(p => p.PageCode == pagecode);
             if (currentPage != null)
             {
                  Page parentPage = Db.Pages.Find(currentPage.ParentId);
                  if (parentPage != null)
                  {
                      sb.AppendFormat((page.PageCode == parentPage.PageCode ||
                      page.PageCode == currentPage.PageCode)
                      ? "<li class=\"active\"><a href=\"/pages/{0}\">{1}</a></li>"
                        : "<li><a href=\"/pages/{0}\">{1}</a></li>", page.PageCode,
                              page.Name.Trim());

                  }
                  else
                  {
                     sb.AppendFormat("<li><a href=\"/pages/{0}\">{1}</a></li>", page.PageCode,page.Name);
                  }
              }
              else
              {
                  sb.AppendFormat("<li><a href=\"/pages/{0}\">{1}</a></li>", page.PageCode, page.Name);
              }
        }
    }
    sb.Append("</ul>");
    sb.Append("</div>");
    return new MvcHtmlString(sb.ToString());
 }

任何人都可以建议我如何使用 MVC HTML 助手(锚、列表(li)、div 等的助手)转换它

4

2 回答 2

3

作为应用程序的架构师,定义助手将生成什么以及不生成什么是您角色的重要组成部分,因为这取决于在您的代码中重复的位置和频率。我不会告诉你构建助手的目的是什么,因为这取决于整个应用程序的架构。但是,为了帮助您做出决定,请考虑您可以构建的两种一般类型的帮助器:全局和本地。

全局帮助程序用于在您的站点中经常重复的代码块,可能有一些小的更改可以通过传递不同的参数来处理。本地助手做同样的工作,但在给定页面上是本地的。具有在其他任何地方都找不到的重复代码段的页面应该实现本地帮助程序。接着...

全局助手:创建一个新的静态类来包含您的助手。然后,在容器类中创建如下所示的静态方法:

public static MvcHtmlString MyHelper(this HtmlHelper helper, (the rest of your arguments here))
{
    // Create your HTML string.
    return MvcHtmlString.Create(your string);
}

Html.这样做是在 Html 助手类上创建一个扩展方法,它允许您使用标准语法访问您的助手。请注意,您必须在要使用自定义助手的任何文件中包含此类的命名空间。

本地助手:当您希望它们位于单个视图的本地时,另一种方法可以使用助手。也许您的视图中有一段代码被一遍又一遍地重复。您可以使用以下语法;

@helper MyHelper()
{
    // Create a string
    @MvcHtmlString.Create(your string here);
}

然后,您可以使用以下命令将其输出到您的页面上:

@MyHelper()

我们总是创建MvcHtmlString对象的原因是因为作为 MVC 内置的安全功能,输出的字符串被编码为在页面上的文本中显示。这意味着 a<将被编码,以便您在页面上实际看到一个“<”。默认情况下,它不会启动 HTML 标记。

为了解决这个问题,我们使用了这个MvcHtmlString类,它绕过了这个安全特性并允许我们将 HTML 直接输出到页面。

于 2012-12-09T08:15:10.787 回答
1

我建议您将所有这些逻辑移到一个单独Section的中,因为它Menu是正在呈现的。

Razor与从代码中构建 HTML 不同,使用's构建它更简洁、更方便helper。请参阅文章以及Scott Gu 的这篇文章,了解如何渲染部分以获得快速入门指南。

考虑使用 Helper 方法,例如

@Html.DropDownListFor() 或者
@Html.DropDownList()

于 2012-12-10T07:18:08.100 回答