贝网博客

我的分类
流水记事
源码下载
Asp.net
其它
数据库
Javascript
.Net技术
我的相册
友情链接
博客园
CSDN博客
Start0
最新回复
fasdfasdf
[:..
lz这个东西好厉害,我..
哈哈,好照片
不错,以前一直用黄色..
终于找到支持ff的修正..
终于找到支持ff的修正..
新鲜性
看看,试试,好不好使。
好东西一起学习[:img0..
分类 =》.Net技术
Asp.net MVC学习笔记
发表于:2012-03-13 17:45:13
更新于:2012-06-07 11:26:53

一直在使用WebForm,最近领导要求项目开始使用MVC,因为服务器还没有安装Framework4,先从MVC2开始吧

1、在IIS里访问MVC路由时,出现404错误,但是在Visual Studio开发服务器里正常
这是因为没有配置IIS通配符应用程序映射,开始=>运行,输入Inetmgr,进入Internet信息服务管理器,在你的网站或虚拟目录上按右键=>属性=>主目录,点击下面的“配置”,在下方的“通配符应用程序映射”里,点“插入”,可执行文件里输入“c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll”,并去掉“确认文件是否存在”,最后点确定即可,现在IIS里访问也正常了
这里有点问题,按上面配置后,任意扩展名请求,都会交给aspnet_isapi.dll去处理了,包括html、jpg、js等常见扩展名了
即使通过routes.IgnoreRoute("{*dir}", new { dir = @".*\.html(.*)?" });忽略这些常用扩展名,也会进isapi走一趟,目前我的做法就是MVC都加一个ashx扩展名,这样IIS也不用配置了(Application_BeginRequest里加断点,可以看到所有的html等请求都会到这个断点)

我用的路由:routes.MapRoute("Default","{controller}.ashx/{action}/{*path}",new { controller = "Home", action = "Index" });

2、路由里的参数名称必须与Controller里的参数名称一致,如配置了一个路由:
routes.MapRoute("mytest","{controller}/MyTest/{id}",new { controller = "Home", action = "MyTest" });
那么HomeController里的方法必须为:
public ActionResult MyTest(string id){}// 如果参数名不是id,而是abc等其它名,就会出现找不到对应的Controller的错误
简单的作法就是配置路由时,不指定参数

3、参数约束:
routes.MapRoute("mytest","{controller}/MyTest/{id}",new { controller = "Home", action = "MyTest" },
new {id = @"\d*"} );// 这个约束表明id必须为数字,而且必须全部是数字(有点疑惑,全数字的正则应该是^\d+$,这里没有开始结束符也可以做到)

4、执行前方法OnActionExecuting:在这里可以在Action执行前做任意操作,比如登录检查等等,如:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    string controllName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    //string actionName = filterContext.ActionDescriptor.ActionName;
    if (!controllName.Equals("Account", StringComparison.OrdinalIgnoreCase)) {
        if (!IsLogin)  {
            filterContext.Result = RedirectToAction("LogOn", "Account"); // Redirect("/Account.ashx/LogOn");
            return;
        }
    }
            
    base.OnActionExecuting(filterContext);
}

5、Controller里的方法不允许重载,即不允许有2个方法名字一样,会造成访问时出错,不知道调用哪个方法

6、通过Post提交数据时,可以通过 方法参数名1=值&方法参数名2=值&……
以便直接把值绑定到参数里(不需要通过Request.Form去自己匹配,MVC自己搞定了),对于Class类型,可以提交json格式,MVC自己转换为这个类型的参数

7、正常情况下,POST数据类型都是:Content-Type: application/x-www-form-urlencoded; charset=UTF-8
某些客户端POST数据时,可能提交类型为:Content-Type: application/octet-stream,这会导致MVC认不到Request.Form,此时需要自行去处理POST参数,如代码:
public ActionResult MVC1(string para)
{
    if (para == null)
    {
        // 当客户端用Content-Type: application/octet-stream传递时
        if (Request.InputStream != null && Request.InputStream.Length > 0)
        {
            string postData;
            using (Stream inStream = Request.InputStream)
            using (StreamReader reader = new StreamReader(inStream, Encoding.UTF8))
            {
                postData = reader.ReadToEnd();
            }
            NameValueCollection tmpNV = HttpUtility.ParseQueryString(postData);
            if(tmpNV != null)
            {
                para = tmpNV["para"];
            }
        }
    }

评论列表(1条)
by: haha
2012-06-15 10:22:39
好东西一起学习
发表评论
名称(*):
邮箱:
正文:

©2008 Beinet.cn 版权所有