ASP.NET MVC 最佳实践(四)

本系列翻译自 Kazi Manzur Rashid 的博客,由于翻译水平有限,本系列可能存在误解偏差或者翻译不准的地方,建议对比原文进行阅读。由于篇幅关系,原文中的一篇文章在本系列中将拆解成多篇发布。本篇包括原文第二部分第18-21节。如果你没有看过之前的第一部分,也许你想先看看 《ASP.NET MVC 最佳实践(一)》、《ASP.NET MVC 最佳实践(二)》和《》。

18. HtmlHelper 扩展

首先,参考一下 Rob Conery这篇文章,我完全同意他的观点,你应该为每种情况创建 Helper 方法,此外我还建议你像 团队那样为可重用的 UI 元素创建 Helper 方法,但是对于在哪里放置我们正在实践的这些方法,我有不同的建议。

应用程序开发者

只为你需要在多个视图中重复使用的HtmlHealper创建单独的扩展方法。对于只在一个视图中使用的帮助方法,你可以为整个视图创建一个Helper类,然后创建一个HtmlHelper来返回这个视图Helper类,而把只在这个视图中使用的扩展方法作为类内部的方法。(这部分未按原文翻译,请自行参照原文)例如:

public class DashboardHtmlHelper {
    private readonly HtmlHelper _htmlHelper;

    public DashboardHtmlHelper(HtmlHelper htmlHelper) {
        _htmlHelper = htmlHelper;
    }

    public string DoThis() {
        //Your Code
    }

    public string DoThat() {
        //Your Code
    }
}

public static class HtmlHelperExtension {
    public static DashboardHtmlHelper Dashboard(this HtmlHelper htmlHelper) {
        return new DashboardHtmlHelper(htmlHelper);
    }
}

然后在视图中这样调用:

<%= Html.Dashboard().DoThis() %>
UI 组件开发人员

如果你在开发的是可以在多个 应用程序中重用的 UI 组件系列,你可以像上面那样为你的整个系列组件创建一个单一名字的Helper。假如你开发的是商业组件,那你可以用你的公司名字来为这个单一的Helper命名,然后在这个Helper中添加方法。否则很容易出现方法的命名冲突。

要是你正在学习 MVCContrib.org 的做法,为 IViewDataContainer 做扩展的话,道理也是一样的。

19. Html编码

在从用户端获取信息的任何情况下,总是使用 Html.Encode(“User Input”) 来编码文本节点,用 Html.AttributeEncode(“User Input”) 来编码Html 元素属性。

20. 不要把Javascript脚本放在你的视图中

不要把你的javascript脚本和html混杂在一起,创建一个单独的 js 文件,把脚本代码放在里面。有时候你可能需要在你的 javascript 代码中传递视图数据,这种特殊的情况下,也只把初始化代码放在视图中。例如,你正在开发 web 2.0 风格的应用,你需要在这个应用中传递 ajax 方法的url,并且需要在 javascript 脚本中传递一些其它的模型数据,这种情况下,你可以参考下面的方式:

视图:

<div id="sideBar" class="column"></div>
        <script type="text/javascript">
            $(document).ready(function(){
                Story.init('<%= Model.UrlFormat %>', '<%= Url.NoIcon() %>', <%= Model.PageCount %>, <%= Model.StoryPerPage %>, <%= Model.CurrentPage %>, '<%= Model.SelectedTab %>', '<%= Model.SelectedOrderBy %>');
            });
        </script>
    </div>
</asp:Content>

Javascript:

var Story = {
    _urlFormat: '',
    _noIconUrl: '',
    _pageCount: 0,
    _storyPerPage: 0,
    _currentPage: 0,
    _currentTab: '',
    _currentOrderBy: '',

    init: function(urlFormat, noIconUrl, pageCount, storyPerPage, currentPage, currentTab, currentOrderBy) {
        Story._urlFormat = urlFormat;
        Story._noIconUrl = noIconUrl;
        Story._pageCount = pageCount;
        Story._storyPerPage = storyPerPage;
        Story._currentPage = currentPage;
        Story._currentTab = currentTab;
        Story._currentOrderBy = currentOrderBy;

        //More Codes
    }
}

这里要为不太熟悉上面的 javascript 的同学解释一下,这是一个在javascript中创建静态类的示例代码。对了,我还差点忘了提一点,永远不要在你的javascript文件中硬编码 ajax 方法的url,虽然 Rob ConeryPhil Haack 在他们的教程中是这样干的。这是一个很不好的方式,它破坏了 ASP.NET 路径重写的优雅性。

21. 使用 jQuery 和 jQuery UI

使用 jQuery 和 jQuery UI,它是最好的js库,并且可以使用 Google CDN 托管服务来加载这些库(对于国内用户,如果使用 google 托管的库一定要有承担风险的准备,具体原因嘛,看看国内6月24日左右的IT新闻就知道了)。

<link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/themes/{YOUR Prefered Theme}/jquery-ui.css" rel="stylesheet"/>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.js"></script>

还有一种更好的方式:

<link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/themes/{YOUR Prefered Theme}/jquery-ui.css" rel="stylesheet"/>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
    google.load("jquery", "1.3.2");
    google.load("jqueryui", "1.7.1");
</script>

以上就是这一次的全部内容。

最后,我要祝贺 团队开发了如此杰出的框架,尤其是他们从社区接受反馈的方式。我希望能用这个框架开发出更多杀手级的应用(注:杀手级的应用程序,一般指极其优秀的应用程序,这类程序超越了语言本身,比语言更有吸引力而且能增加语言的吸引力)。

               

ASP.NET MVC 最佳实践(四)》上有4条评论

  1. ~疯子。

    吴老:
    你这还有有关mvc的信息资料么。。。有的时候告诉我 下。。。。谢谢!!
    07级呢

  2. Pingback引用通告: ASP.NET MVC 最佳实践(三) | 所谓技术 - 小李刀刀博客

评论已关闭。