又快有1个月没写东西了,不是因为懒,而是忙于学习。ASP.NET MVC Preview 2已经发布一段时间了,在网上看到了一些相关的文章,但是由于是Preview的版本,没有SDK,学习很辛苦。很多文章都讲了Route的用法,Google一下太多了。但是我遇到了一些问题却始终没有找到答案,先在这里分享一下,看看大家有没有更好的方法。
我们在做一个web app的时候,通常会有很多的模块,例如MIS系统,里面会有CRM\HR等,这时再进行构架的时候,就会出现这样一个问题可能在不同的模块中都会有HomeController,当然我们可以在Project中添加文件夹,并使用不同的名称空间来解决,而且在URL上也可以自己添加Route来搞定。这些在Google都能找到解决方案,但是在View层的问题就麻烦了。类似于Controller,不同的模块都有Index视图,而默认情况下视图是依赖于文件系统的,而且还有。。。(下面说),view code 先,
public class WebFormViewLocator : ViewLocator {
public WebFormViewLocator() {
ViewLocationFormats = new[] {
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
};
MasterLocationFormats = new[] {
"~/Views/{1}/{0}.master",
"~/Views/Shared/{0}.master"
};
}
}
这个部分是MVC中WebFormViewLocator的构造函数,大家可以看出一个问题在,在Controller中调用RenderView的时候你只能指定View的Name,然后默认情况下WebFormViewEngine会调用IViewLocator的GetViewLocation方法,这个时候传入的参数就是viewContext和viewContex.ViewName,所以如果你的View没有按照这个格式保存在相应的目录中就会出现问题。
Code看过了,那问题就来了应用稍微复杂一些,我们的View就会有很多了中不能按照这种发式进行开发呀。
接下来又要仔细的看看Source Code了,ViewLocator在GetPaht函数中调用了一个IsSpecificPath的函数
private static bool IsSpecificPath(string name) {
return
name.StartsWith("~", StringComparison.Ordinal) ||
name.StartsWith("/", StringComparison.Ordinal);
}
这回看明白了,只要在RenderView的时候按照这个规则写上路径就可以了,当然要添加.aspx后缀名。
没有SDK的日子。。。。。。