我在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提取。
欢迎任何建议。感谢。
答案 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 }
);