ASP.NET在

时间:2017-06-19 09:22:49

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

我在Flask中编写了一个非常简单的Web应用程序,并将其移植到ASP.NET Framework。所有功能都在JavaScript和HTMl中,因此框架应该只是作为脚手架。除了似乎是路由问题之外,我几乎已经移植了所有东西。我的网站需要将字符串标记变量附加到URL,如下所示:www.mysite.com/token-string。对于开发,网址为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 }
        );
    }
}

令牌以它的方式传递非常重要,而不是作为?查询参数或类似的东西。此外,C#索引视图并不需要对令牌执行任何操作 - 它会被JavaScript提取。

欢迎任何建议。感谢。

3 个答案:

答案 0 :(得分:2)

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

您需要做的是插入一个限制匹配您的令牌网址的路由。假设您的令牌是GUID,您可以使用regex route constraint,如下所示:

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;
    }
}

请注意,您应使用{token}参数中的路由值键url:来匹配操作方法参数名称token

public ActionResult Index(string token)
{
    return View();
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您使用的默认路由模式需要名称为' id'

的参数

添加(或修改默认路线),如下面的路线模式

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