加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 20:13:23 所属栏目:asp.Net 来源:网络整理
导读:我需要为其中一个网站提供以下功能. http://www.example.com/ [赞助] / {控制器} / {行动} 根据[赞助商],必须定制网页. 我尝试将路由注册到Application_Start和Session_Start,但不能使其正常工作. public static void RegisterRoutes(RouteCollection routes
我需要为其中一个网站提供以下功能.

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读