【问题标题】:ASP.Net MVC route to account nameASP.Net MVC 路由到帐户名称
【发布时间】:2016-02-10 14:42:16
【问题描述】:

有一些类似甚至相同的问题,但我想分享我想做的事情,因为我仍然在为此苦苦挣扎。

一般来说,我希望允许用户切换帐户。切换过程也应该从 URL 完成。例如,如果用户键入此 URL www.domain.com/accountname,则应将其重定向到他提供的帐户。我部分完成了这个功能,但我无法完全完成这个功能。

我想满足以下要求:

  1. 如果用户提供没有帐户名称的 URL,它应该导航到用户必须选择某个帐户的帐户页面。该 URL 的示例是:www.domain.com/controller/action
  2. 如果用户提供了错误的帐户名或不属于他的帐户名,则应将其重定向到适当的控制器和适当的操作。
  3. 如果用户提供正确的帐户名称以及他可以访问的位置,则应将他重定向到帐户控制器和 SwithByName 操作。
  4. 一旦用户提供了帐户名称,它应该始终显示在浏览器的 URL 中。

我试图在 RoutesConfig 中实现这一点,我在其中添加了一条自定义路由。

这是我的默认路线:

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

在默认路由之前,我添加了自定义路由:

routes.MapRoute(
            name: "AccountRoute",
            url: "{accountName}",
            defaults: new { controller = "Account", action = "SwitchByName", id = UrlParameter.Optional }
        );

我在上面提供的配置可以正常工作,但不能满足第四个要求。

例如,如果我提供 www.domain.com/account,它会将我重定向到该帐户并且它可以工作。但是,如果我从菜单中单击其他内容,它将重定向我并在浏览器中显示 URL,如下所示:www.domain.com/controller/action。这不是我所期望的,我想要这样的东西:www.domain.com/account/controller/action。如果我手动提供以下 URL www.domain.com/account/controller/action 它会抛出异常。

您能给我一些关于 RoutingConfig 的建议吗?

我也尝试过使用过滤器,但在我看来,通过路由来实现这一点是更正确的方法。

谢谢

【问题讨论】:

  • 什么版本的 MVC?

标签: c# asp.net-mvc


【解决方案1】:

您应该使用accountName 而不是id 作为您的默认声明。

routes.MapRoute(
    name: "AccountRoute",
    url: "{accountName}",
    defaults: new { controller = "Account", action = "SwitchByName", accountName = UrlParameter.Optional }
);

并声明 accountName 作为 MVC 操作方法的参数。

public class AccountController : Controller
{
    public ActionResult SwitchByName(string accountName)
    {
        ViewBag.Title = "Account name: "+ accountName;

        return View();
    }
}

【讨论】:

  • 我试过这个,但它对我不起作用。如果我使用带有默认参数的“accountName”,它将触发“SwithByName”操作,这很好。当请求到达 accountName=null 的“SwithByName”操作时,一些逻辑应该重定向到另一个特定页面。该部分无法正常工作,因为它再次重定向到“SwitchByName”操作并变为无穷大。
  • @ivan.petrovic 您是否在路由配置中添加了默认路由和“AccountRoute”?因为它适用于我的实现。
  • 是的,我有默认路由。当我解决我的问题时,我会提供更新。
【解决方案2】:

试试这个:

routes.MapRoute(
            name: "AccountRoute",
            url: "{accountName}/{controller}/{action}/{id}",
            defaults: new { controller = "Account", action = "SwitchByName", id = UrlParameter.Optional },
            constraints: new { accountName="Regex";/*minimum 1 char*/ }
        );

public ActionResult SwitchByName(string accountName)
    {
        //use accountName;

        return View();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多