ASP.NET在URL中传递参数

3
我在Flask中编写了一个非常简单的Web应用程序,并将其移植到ASP.NET Framework。所有功能都在JavaScript和HTML中,因此框架只需充当脚手架即可。我已经几乎将所有内容移植完成,除了似乎存在路由问题。我的网站期望在URL后附加一个字符串令牌变量,如下所示:www.mysite.com/token-string。对于开发,URL为localhost:*****/string-token,默认显示我的Index.cshtml页面。

当我不带令牌传递URL时,它可以正常工作并加载我的主页。但是,当我尝试使用令牌时,会得到404错误。我想它将令牌识别为路由并尝试导航到它?我不知道如何修复它。以下是我代码的重要部分:

HomeController.cs:

public class HomeController : Controller
{
    public ActionResult Index(string token)
    {
        return View();
    }
}

RouteConfig.cs: 注意:我没有进行更改,不确定该怎么处理。

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

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

在传递token时,以它现在的方式传递是非常重要的,而不是作为一个?查询参数或类似的其他方式。此外,C#索引视图实际上不需要对token进行任何操作-它由JavaScript提取。

如果有任何建议请告诉我们,谢谢!


你需要使用 www.mysite.com/?token='token-string' 来使用默认路由的 token 字符串,因此定义一个路由,该路由期望 token 参数 (url: "{controller}/{action}/{token}"),其中 token 是必需参数。 - Tetsuya Yamamoto
@TetsuyaYamamoto 这是唯一的方法吗?我在问题中确实说明了它必须以www.mysite.com/string-token的格式呈现。 - Jack Parkinson
在MVC 5中,您可以在Index操作方法上使用属性路由和路由[Route("~/{token?}")],这将导致www.mysite.com/string-token的路由。或者定义Index操作方法:url: "{token}"(默认路由为controller =“Home”,action =“Index”,token = UrlParameter.Optional)。 - Tetsuya Yamamoto
@TetsuyaYamamoto 谢谢,解决了 - 如果你将其放入答案中(另外两个没有用),我可以接受 :) - Jack Parkinson
3个回答

2

每个路由中的片段(即{controller})都是变量,在默认路由中将它们全部设置成可选项。因此,您的默认路由匹配请求 www.mysite.com/token-string

您需要做的是插入一个具有约束条件的路由,以仅匹配包含您的令牌的 URL。假设您的令牌是 GUID,您可以使用正则表达式路由约束,如下所示:

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

        routes.MapRoute(
            name: "TokenRoute",
            url: "{token}",
            defaults: new { controller = "Home", action = "Index" },
            constraints: new { token = @"^[0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12}$" }
        );

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

如果您的令牌不是GUID,则可以使用不同的正则表达式或实现IRouteConstraint来确保路由仅匹配您的令牌。您使用的逻辑可以简单到一个 == 语句(如所示)或更复杂(例如数据库查找)。

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

    routes.MapRoute(
        name: "TokenRoute",
        url: "{token}",
        defaults: new { controller = "Home", action = "Index" },
        constraints: new { token = new TokenConstraint() }
    );

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

public class TokenConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if ((string)values[parameterName] == "MyToken")
        {
            return true;
        }

        return false;
    }
}

请注意,您应该在url:参数中使用路由值键{token}来匹配操作方法参数名称token
public ActionResult Index(string token)
{
    return View();
}

非常感谢,回答很棒 - 我也非常感激有关以不同方式限制允许的字符串类型的额外信息。 - Jack Parkinson

0

我猜你可以尝试将默认路由更改为包括令牌而不是ID,如下所示。

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

不幸的是,这对我没有起作用 - 我设法通过使用URL作为url:{token}来使其工作。 - Jack Parkinson

0

您所期望的默认路由模式需要带有名称为“id”的参数。

可以像下面这样添加(或修改默认路由)路由模式:

routes.MapRoute(
    name: "AnotherRoute", //your desired route name
    url: "{controller}/{action}/{token-string}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

不幸的是,这对我没有起作用 - 我设法通过使用URL作为url: {token}来使其工作。 - Jack Parkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接