本系列翻译自 Kazi Manzur Rashid 的博客,由于翻译水平有限,本系列可能存在误解偏差或者翻译不准的地方,建议对比原文进行阅读。由于篇幅关系,原文中的一篇文章在本系列中将拆解成多篇发布。本篇包括原文第二部分第18-21节。如果你没有看过之前的第一部分,也许你想先看看 《ASP.NET MVC 最佳实践(一)》、《ASP.NET MVC 最佳实践(二)》和《ASP.NET MVC 最佳实践(三)》。
18. HtmlHelper 扩展
首先,参考一下 Rob Conery 的这篇文章,我完全同意他的观点,你应该为每种情况创建 Helper 方法,此外我还建议你像 ASP.NET MVC 团队那样为可重用的 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 组件开发人员
如果你在开发的是可以在多个 ASP.NET MVC 应用程序中重用的 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 Conery 和 Phil 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 团队开发了如此杰出的框架,尤其是他们从社区接受反馈的方式。我希望能用这个框架开发出更多杀手级的应用(注:杀手级的应用程序,一般指极其优秀的应用程序,这类程序超越了语言本身,比语言更有吸引力而且能增加语言的吸引力)。
作者:小李刀刀
原文链接:ASP.NET MVC 最佳实践(四)
裁纸刀下版权所有,允许非商业用途转载,转载时请原样转载并标明来源、作者,保留原文链接。
吴老:
你这还有有关mvc的信息资料么。。。有的时候告诉我 下。。。。谢谢!!
07级呢
网上搜索一下吧,有很多资源的。
http://asp.net/mvc/
测试AJAX评论
Pingback引用通告: ASP.NET MVC 最佳实践(三) | 所谓技术 - 小李刀刀博客