Welcome 微信登录

首页 / 网页编程 / ASP.NET / 为视图自定义辅助方法(下)

为视图自定义辅助方法(下)2011-03-19 博客园 老赵在上一篇文章中,我们把繁冗的客户端脚本变成了可以由Visual Studio提示并轻易输出的服务器端辅助方法。但是,目前的做法还有不少可以改进的地方。我们编写辅助方法的目的便是为了简化开发,因此我们还可以在这条路上走的更远,让开发人员可以在使用我们的API时觉得更流畅,更有快感。

简化入口

目前,我们的辅助方法的使用方法大约如下:

<span>Name: </span> <!-- 必填 -->
<input type="text" name="user.Name" />
<% this.JQuery().Validate().Required("user.Name", "please provide your name!!!"); %>

而内置的辅助方法是这样使用的:

Html.ActionLink("Home", "Index")

比较两者就可以看出差别:

由于只有“扩展方法”没有“扩展属性”,因此JQuery后面的括号不可少。

由于利用了“扩展方法”,因此前面this关键字无法省略。

从某些角度看来,这么做其实并不会造成太大差别。不过在老赵看来,我们在前端定义视图时,我们并非在使用C#进行开发,而是在使用一种DSL——当然,是C#实现的Internal DSL。例如,在上面的代码中访问Html时,老赵并没有过分认为这是一个“属性”。在设计DSL,尤其是Internal DSL的时候,我们往往都需要考虑到实际需求,尽可能得到更加优美的语法。这样看来,this关键字和“作用不大”的括号也像是一种累赘。因此我们做的第一件事情,便是简化辅助方法的入口。

造成“累赘”的关键性因素便是“扩展方法”这个特性,但是如果我们要去除扩展方法的使用,就必须把“入口”直接定义在ViewPage中,这就要求我们的视图继承我们定义的基类,而不是直接继承ViewPage。这一点看上去是额外的工作,但是在实际项目中由于自然需要,我们一般都会定义这样的类型。而即使您的项目还没有自定义的基类,也建议您从一开始便采取这种做法。因为随着项目的发展,您很可能在某一时刻就发现您很渴望有一个统一的地方可以处理一些相同的逻辑,如果您这时再去修改项目中所有的视图,这会是一件劳民伤财的事情。相反,如果您一开始便定义了共同的基类,那么进行这种功能补充就会变得轻而易举。而且,即使您没有为基类添加任何功能,也不会造成任何损失。

目前,我们的基类只需要定义一个JQuery属性便可:

namespace MvcApp.Views
{
public class ViewPageBase : ViewPage
{
private JQueryHelper m_jquery;
public JQueryHelper JQuery
{
get
{
if (this.m_jquery == null)
{
this.m_jquery = new JQueryHelper(this.ViewContext, this);
}

return this.m_jquery;
}
}
}
}

由于不同的Page对象已经为我们做好了分离,我们已经不需要把JQueryHelper对象放在Page.Items集合中了。而现在,我们便可以使用这样的方式来改写之前的代码:

<span>Name: </span> <!-- 必填 -->
<input type="text" name="user.Name" />
<% JQuery.Validate().Required("user.Name", "please provide your name!!!"); %>

您是否觉得更清楚了一些呢?