微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc-3 – ASP.net MVC路由与可选的第一个参数

我需要为其中一个网站提供以下功能.

http://www.example.com/ [赞助] / {控制器} / {行动}

根据[赞助商],必须定制网页.

我尝试将路由注册到Application_Start和Session_Start,但不能使其正常工作.

public static void RegisterRoutes(RouteCollection routes,string sponsor)
{
        if (routes[sponsor] == null)
    {
      routes.MapRoute(
     sponsor,// Route name
     sponsor + "/{controller}/{action}/{id}",// URL with parameters
     new { controller = "Home",action = "Index",id = UrlParameter.Optional } // Parameter defaults
     );
    }
}

另外,没有[sponsor]的认行为也应该起作用.
有人可以让我知道如果在技术上可行的是在MVC3 URL中有一个可选的第一个参数.如果是,请分享实施.谢谢.

更新代码
在由Sergey Kudriavtsev建议进行更改后,代码在给出值时工作.
如果未提供名称,则MVC不会路由到控制器/操作.

请注意,这仅适用于家庭控制器(双方和非赞助商).对于其他控制器/动作,即使指定了sponsor参数,它也不是路由.

请建议什么需要修改.

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
             "SponsorRoute","{sponsor}/{controller}/{action}/{id}",// URL with parameters
             new { controller = "Home",id = UrlParameter.Optional }
        );

        routes.MapRoute(
            "NonSponsorRoute","{controller}/{action}/{id}",new { controller = "Home",id = UrlParameter.Optional,sponsor = string.Empty }
        );
    }

行动方法

public ActionResult Index(string sponsor)
    {
    }

解决方法

在您的情况下,赞助商不应被视为URL的常数部分,而应视为可变部分.

在Global.asax中:

public static void RegisterRoutes(RouteCollection routes)
{
...
     routes.MapRoute(
     "SponsorRoute",id = UrlParameter.Optional }
     );
     routes.MapRoute(
     "NonSponsorRoute",sponsor=string.Empty }
     );

...
}

在你的控制器中,例如HomeController.cs:

namespace YourWebApp.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index(string sponsor)
        {
            // Here you can do any pre-processing depending on sponsor value,including redirects etc.
        }
        ...
    }
}

请注意,此参数的类型将始终为System.String,并且路由模板组件{赞助者}的名称必须与控制器中操作参数字符串赞助商的名称完全相符.

UPD:为非赞助者案例增加了第二条路线.

请注意,这样的设置会使您的逻辑复杂化,因为您可能会混淆不同的网址,例如URL

http://www.example.com/a/b/c

可以通过两条路线匹配:第一个将有赞助者= a,controller = b和action = c;第二个将有controller = a,action = b和id = c.

如果您对URL指定了更严格的要求,则可以避免这种情况 – 例如,您可能希望ID仅为数字.限制在routes.MapRoute()函数的第四个参数中指定.

消除歧义的另一种方法是在赞助商的通用路线之前为所有控制器指定单独的路线(通常您的应用中不会有太多的控制器).

UPD:

区分赞助商和非赞助商路线的最简单但最不可维护的方法是指定特定于控制器的路由,如下所示:

public static void RegisterRoutes(RouteCollection routes)
{
...
     routes.MapRoute(
     "HomeRoute","Home/{action}/{id}",sponsor=string.Empty }
     );
     routes.MapRoute(
     "AccountRoute","Account/{action}/{id}",// URL with parameters
     new { controller = "Account",sponsor=string.Empty }
     );

     ...

     routes.MapRoute(
     "SponsorRoute",id = UrlParameter.Optional }
     );

...
}

请注意,这里所有控制器特定的路由必须在SponsorRoute之前添加.

更复杂,更干净的方法是在@counsellorben的回答中描述,为赞助商和控制器名称实现RouteConstraints.

原文地址:https://www.jb51.cc/aspnet/246168.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐