【问题标题】:MVC Route MappingMVC 路由映射
【发布时间】:2014-04-22 17:52:54
【问题描述】:

我有一个网站,xyz.com,用户正在设置管理员帐户,然后他们有其他用户在他们下注册。他们称他们的帐户名称为wisconsinsponsor。另一个用户设置了另一个名为iowasponsor 的帐户。因此,我希望能够让用户浏览到 xyz.com/wisconsinsponsorxyz.com/iowasponsor 并进入这些用户设置的适当设置。

然后,在我浏览到 xyz.com/wisconsinsponsor 后,我可以为 wisconsinsponsor 获得适当的设置,然后我可以转到 xyz.com/wisconsinsponsor/{controller}/{method}

所以我添加了以下代码。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    List<Sponsor> sponsors = new SponsorContext().Sponsors.ToList();

    foreach (Sponsor sponsor in sponsors)
    {
        // ALL THE PROPERTIES:
        // rentalProperties/
        routes.MapRoute(
            name: sponsor.SponsorName,
            url: sponsor.SponsorName + "{controller}/{action}/{id}",
            defaults: new
            {
                controller = "Home",
                action = "Index",
                id = sponsor.SponsorId
            }
        );
    }


    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { 
            controller = "Home", 
            action = "Index", 
            id = UrlParameter.Optional }
    );
}

所以主要目标是在不登录的情况下,我可以获得与每个“赞助商”相关的信息,然后如果用户在没有指定赞助商的情况下访问“xyz.com”,则可以获得一般信息。以下内容可以登陆主页,但是当我导航到登录或任何其他视图时,我得到例如'xyz.com/[我在数据库中的第一个赞助商条目]/admin/login'而不是'xyz.com/admin/login'。为什么导航不掉到默认路由?

【问题讨论】:

  • 将您的赞助商视为一个参数(就像控制器和操作一样),而不是在 for 循环中为所有不同的赞助商生成路由

标签: c# asp.net-mvc asp.net-mvc-routing mvcroutehandler


【解决方案1】:

更改您的路由以仅包含赞助商,不要为每个赞助商创建单独的路由,这就是路由变得如此强大的地方

routes.MapRoute(
    name: null, //routes names must be unique, but you can have multiple named null (go figure)
    url: "{sponsor}/{controller}/{action}/{id}",
    defaults: new
    {
        sponsor = "defaultSponsor", //or whatever you want the default to be
        controller = "Home",
        action = "Index",
        id = UrlParameter.Optional
    }
);

然后,用赞助商参数装饰您的每个操作方法

public ActionResult Index(string sponsor, int id) { }

重新阅读您的问题,这在没有赞助商的情况下无济于事,除非您的“defaultSponsor”不是真正的赞助商,而是您提供的通用信息。因此,当地址栏中没有赞助商传递给路由时,您会看到 'defaultSponsor' 或空字符串,然后可以适当处理

以这种方式处理它的另一个原因是 RegisterRoutes 仅在应用程序启动时调用,因此如果它们是在应用程序运行时动态添加的,它们将是无效路由,直到应用程序重新启动。通过将其作为参数,它们也可以动态工作。

【讨论】:

  • 是的,这些将被动态创建并由数据库驱动。我该如何处理这种由数据库驱动的情况?
  • 通过接受它们作为我在回答中显示的控制器操作的参数,然后像使用其他路由一样加载它们(我刚刚更改了 id 参数,因为我没有'没有意识到它来自您的赞助商循环)。但是您将根据赞助商参数或您最初计划执行的 id 加载数据
  • 看到 RegisterRoutes 仅在应用程序启动时被调用,我可以在将新赞助商添加到数据库时将条目推送到路由表吗?
  • 如果你使用我建议的方法,它就不需要了,因为它变得更加动态。根据您的路由发布您正在调用的 Action 方法的示例,我将尝试根据我提供的路由示例来帮助定义它。
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2011-04-10
  • 2010-11-08
相关资源
最近更新 更多