gpt4 book ai didi

c# - MVC Controller Action 应该只处理某些参数值,否则为 404

转载 作者:太空宇宙 更新时间:2023-11-03 23:18:54 24 4
gpt4 key购买 nike

我有一个带有一个参数的 MVC Controller 操作,该操作只应使用该参数的某些值(空/空和一些特定字符串)调用,在其他情况下不应命中(大多数情况下为 404)。我试过使用如下所示的 RegexRouteConstraint。但这不会过滤特定的字符串。

var route = new Route("{soortAanbod}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Homepage", action = "Index", soortAanbod = UrlParameter.Optional }),
Constraints = new RouteValueDictionary(new { soortAanbod = new RegexRouteConstraint("a|b|c|d|e") }),
DataTokens = new RouteValueDictionary { { "area", context.AreaName } }
};
context.Routes.Add("Homepage_soortAanbod", route);

Controller 看起来像这样:public ActionResult Index(string soortAanbod)

我也尝试过使用 Action 过滤器,但这会弄乱其他过滤器。我怎样才能使这条路线只匹配 soortAanbod 的指定值?

最佳答案

您有 2 个问题:

  1. 您的正则表达式不包含 anchors (^$) 来分隔您尝试匹配的字符串。因此,它匹配任何包含这些字母的字符串。
  2. 您的 URL 将始终匹配默认路由,因此即使您的自定义路由不匹配,您仍然会到达该页面。默认路由将匹配长度为 0、1、2 或 3 段的任何 URL。

您可以通过删除自定义路由并使用 IgnoreRoute(在幕后使用 StopRoutingHandler)来避免匹配这些特定 URL 来解决此问题。

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

routes.IgnoreRoute("Homepage/Index/{soortAanbod}",
new { soortAanbod = new NegativeRegexRouteConstraint(@"^a$|^b$|^c$|^d$|^e$") });

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

不过有一个警告。正则表达式是 not very good at doing negative matches ,所以如果您不是 RegEx 大师,最简单的解决方案是构建一个 NegativeRegexRouteConstraint 来处理这种情况。

public class NegativeRegexRouteConstraint : IRouteConstraint
{
private readonly string _pattern;
private readonly Regex _regex;

public NegativeRegexRouteConstraint(string pattern)
{
_pattern = pattern;
_regex = new Regex(pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.Compiled);
}

public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (parameterName == null)
throw new ArgumentNullException("parameterName");
if (values == null)
throw new ArgumentNullException("values");

object value;
if (values.TryGetValue(parameterName, out value) && value != null)
{
string valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
return !_regex.IsMatch(valueString);
}
return true;
}
}

关于c# - MVC Controller Action 应该只处理某些参数值,否则为 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36134836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com