扩展ASP.NET网页 - 创建自己的佣工

WebMatrix的Beta1版本附带了许多网页助手,使您的生活简单。这些包括助手与文件上传,图像,电子邮件,缓存,网格,Twitter Feeds以及更多的工作。我怀疑,因为产品发展到全额释放,更多将增加。尽管如此,WebMatrix和网页的开发人员无法预测每个要求,因此您将觉得您需要额外的东西。正如本文展示的那样,添加自己的佣工很容易。

目前没有帮助的一个区域正在消耗RSS源。所以我将建立一个帮助程序,允许用户在网页上显示RSS的一部分。我将在这里显示的代码是作业,虽然它远非完美。其目的是说明创建帮助者所涉及的要点,而不是如何制作RSS阅读器的制作示例。它对一件事缺乏太多异常处理,我觉得增加了太多会掩盖这篇文章的主要推动力。因此,我不会深入浏览到实际的辅助代码中,但我将注意在开发助手时应该考虑的关键区域。

第一个要做的是将一个新文件夹添加到网站。必须命名此文件夹"App_Code"。 WebMatrix的未来版本可能会在类似的内容中提供"添加新的ASP.NET文件夹"某些阶段的菜单选项,但目前尚未使用。 app_code. 是一个特殊文件夹。 ASP.NET将在此网站运行时第一次在此内部编译任何内容,并且它将在整个站点中的其他代码中使用。在该文件夹中,添加一个新文件。文件类型是C#类文件。

调用此文件"RssReader.cs",然后删除其中的所有代码,然后用以下替换它:

using System;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Xml.Linq;


公共静态 class RssReader
{
  公共静态 htmlstring. GetHtml(string url, int numberOfItems = 5, 
  				bool showDescription = true, bool showDateCreated = true, int width = 300)
  {
    TagBuilder divTag = new TagBuilder("div");
    TagBuilder pTag = new TagBuilder("p");
    TagBuilder anchor = new TagBuilder("a");
    
    var doc = XDocument.Load(url);
    XNamespace a10 = doc.Root.GetNamespaceOfPrefix("a10");
    var items = doc.Descendants("item").Select(feed => new
    {
      Title = feed.Element("title"),
      Link = a10 != null ? feed.Element(a10 + "link").Attribute("href").Value : feed.Element("link").Value,
      Date = feed.Element("pubDate"),
      Description = feed.Element("description")
    }).Take(numberOfItems);

    divTag.MergeAttribute("id", "rssDiv");
    divTag.MergeAttribute("style", "width:" + width + "px");
    foreach(var item in items)
    {
      anchor.InnerHtml = item.Title.Value;
      anchor.MergeAttribute("href", item.Link);
      pTag.InnerHtml = anchor.ToString();
      divTag.InnerHtml += pTag.ToString();
      if(showDateCreated)
      {
        TagBuilder pTag2 = new TagBuilder("p");
        DateTime dateValue;
        if(DateTime.TryParse(item.Date.Value, out dateValue))
        {
          pTag2.InnerHtml = dateValue.ToString("G");
        }
        divTag.InnerHtml += pTag2.ToString();
      }
      if(showDescription)
      {
        TagBuilder pTag3 = new TagBuilder("p");
        pTag3.InnerHtml = item.Description.Value;
        divTag.InnerHtml += pTag3.ToString();
      }
    }
    return new htmlstring.(divTag.ToString());
  }
}

右 - 在你传出之前,让我解释这个代码如何工作。真的很简单。前5行使某些命名空间可用于代码,以便在我们参考其中的项目时,我们不必使用完全限定的名称。你可以看到 公共静态 htmlstring. 在代码的开头附近。完全合格的参考 htmlstring. 是system.web.mvc.htmlstring,而无需添加使用语句以使system.web.mvc可用于类文件,我们必须在每次想要引用htmlstring时键入完全限定的名称。 System.Web.mvc也使Tagbuilder以短手的方式提供。

您还应该注意,RSSReader类和GetHtml方法都是静态的。这意味着我们不必创建RSSReader的实例,以便从网页或其他代码调用GetHtml方法。这是典型的辅助方法,以及一般的实用方法。

GetHtml方法的参数也值得注意。第一个是必需的参数。换句话说,当调用gethtml方法时,必须将字符串传递为参数。理想情况下,该字符串将是指向RSS Feed的位置的有效URI。没有检查方法以确保它是。这是我前面提到的缺失的异常管理部分之一。其他4个参数都是可选的。换句话说,呼叫者无需为它们提供任何值。您可以看到它们是可选的,因为它们具有默认值。 可选参数 在C#4.0中添加,是一种广泛的方式来增加灵活性,而无需创建GetHtml方法的多载版本。在所有必需参数之后,必须始终声明可选参数(除了涉及参数阵列的一个案例之外,但这在这里并不重要)。

下一个注意事项是创建的3个标记对象。 TagBuilder是一个非常有用的类,如果您希望帮助HTML元素以及HTMLString,请使用ASP.NET MVC引入非常有用的类。标记允许您指定HTML标记,如a<p> for paragraph, or <input type="text" />,不必用手动构建字符串而不必小提琴,这可能会出错,尤其是在尝试处理嵌入的双引号时。 HTMLString可确保标签和HTML的结果的CONGONETE呈现为HTML,而不是编码HTML编码。

通过XDocument.Load()方法获得RSS Feed,该方法是System.xml.linq的一部分。我不会进入太多细节 LINQ到XML. 但是,一旦你掌握了主题的基础(我希望有一天......),它是一个很好的方式来处理XML,这就是RSS Feed是什么。足以说假设负载方法实际上设法检索XML文件(再次,错误检查应该在那里地到位)一些项目是从中检索的,并用于构建对象的集合。构建了多少对象取决于传递给NumberOfitems参数的值。如果没有提供任何值,则会默认为5项。

现在我们有一个对象的集合,他们通过迭代来构建一些HTML。由此产生的RSS馈送将容纳在div元素中,默认情况下宽度为300px。如果他们选择将值传递到方法中,则可以由用户自定义。在迭代集合时,代码从项目的链接属性中构建了HTML链接,并将其放入段落元素中。然后它检查OT,看看呼叫者是否决定在其RSS阅读器中包含已发布日期。如果他们确实或留下了默认值,则将其添加到另一个段落元素中。最后,如果showdescription值为true,则在循环到集合中的下一个项目之前,将项目描述添加到另一个段落。最后,整个批次作为一串HTML返回给呼叫者。

在显示CSHTML文件中如何使用此代码之前,我将花费一秒钟才能查看关于构造助手的关键点:

  1. app_code. is the place for class files which need to be made available across the site
  2. 辅助课程和方法总是应该是静态的
  3. HTMLStrings确保将浏览器呈现的任何渲染为HTML
  4. 标记制作有效的HTML更容易
  5. 可选参数通过减少创建重载的方法来保存大量代码

以下是可以在网页文件中调用帮助器的几种方式:

@RssReader.GetHtml("http://www.lssc9d.icu/rss")

@RssReader.GetHtml("http://www.lssc9d.icu/rss/", showDescription: false, width: 400, numberOfItems: 10)

第一行利用应用于可选参数的所有默认值,而第二个将项目的数量更改为10,则增加壳体div的宽度,并选择不显示描述。它让帮助者展示了日期。您还应该注意到可选的参数参数是由参数的名称前缀的,并且在方法参数列表本身中显示的顺序中,未添加到方法调用。命名参数也被引入C#4.0中,并且还提供了前面提供的可选参数的链接,此外更多关于此内容。