代码改变世界

ASP.NET MVC小记

2010-10-07 21:01  音乐让我说  阅读(513)  评论(0编辑  收藏  举报
  1. 在 ASP.NET MVC 2.0 中,一个普通的Action,比如:public ActionResult News(int? pageIndex)。如果在列表页面,页首有菜单导航,那么必须显示配置pageIndex = 1 :
    <%= Html.ActionLink("新闻", "News", new { pageIndex = 1 }) %> ,只要配置一个路由即可,路由配置如下:
    
    routes.MapRoute("CompanyNewsPager", "Company/News/{pageIndex}", new
                {
                    controller = "Company",
                    action = "News",
                    pageIndex = 1
                });
    
  2. 关于
    public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
    
    的使用。比如我在Global.asax中的RegisterRoutes方法中配置了如下路由:
    routes.MapRoute("Friends", "Friends/{action}", new { controller = "Friends",action = "Index" }, new { isLoal = new LoalRouteConstraint() });
    
    那么当前客户端只能本机才可以访问/Friends/*。LoalRouteConstraint 类中的代码如下:
    using System.Web;
    using System.Web.Routing;
    
    namespace WebUI.Extensions
    {
        public class LoalRouteConstraint : IRouteConstraint
        {
            public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
            {
                return httpContext.Request.IsLocal;//只允许本机匹配
            }
        }
    }
    
  3. 在Action 方法上标记[NonAction()] Attribute 表明:这个方法不是Action 方法,即不能通过浏览器访问
  4. Model 绑定只绑定UserInfo类的YouInputText属性:或者是排除某个属性:
    public ActionResult TestActionFilter([Bind(Exclude = "Id,Age")] UserInfo userInfo, FormCollection formColle)
    
    public ActionResult TestActionFilter([Bind(Include = "YouInputText")] UserInfo userInfo)
    
  5. 在一个ASP.NET MVC 应用程序中,假设存在物理路径 /Products/List/Add.aspx ,那么如果在浏览器中访问这个地址,这个 aspx 页面是会执行的。因为默认

    RouteCollection 不会对已存在的文件路由(RouteCollection.RouteExistingFiles=false),要想让 ASP.NET 路由这个URL,则把该属性值设置为true,那么
    ProductsController就会执行了。

  6. 手动初始化 UrlHelper:
    string loginUrl = new UrlHelper(filterContext.RequestContext).Action("LogOn", "Account");

     

  7. MVC IOC
    RouteData routeData = RouteTable.Routes.GetRouteData(filterContext.HttpContext);   // 得到当前请求的路由数据
    
    
    DependencyResolver.Current.GetService<IProductService>();  // 得到当前在 IOC 中注册的 IProductService 的实现类

     

     
  8. ASP.NET MVC 中尽量不要用 RedirectToRoute 来跳转,而要用 RedirectToAction 明确指定 Controller、Action,除非你在 Global.asax 配置的这个路由有明确的指定 Controller、Action,否则很可能出现死循环或者 404 错误,比如:在 Account 的 Logon 中登录成功后,跳转到 Product 的 Index 中,如果用 RedirectToRoute,很可能死循环或者跳转到 /Product/Logon 页面,因为你在路由中用了 Controller 或 Action 的默认值。
  9. ASP.NET MVC 中的 ActionDescriptor 类 或者 ControllerDescriptor 类分别表示标记在 Action 和 Controller 上面的 Attribute。
  10. ASP.NET MVC 4 中有一个 AllowAnonymousAttribute.cs 类,它可以标记在 Controller 或者 Action 上,用于跳过 AuthorizeAttribute 授权验证。
  11. 谢谢浏览...