查询字符串参数的ASP.NET MVC约束

查询字符串参数的ASP.NET MVC约束,asp.net,asp.net-mvc,routing,Asp.net,Asp.net Mvc,Routing,我有两个动作 public Action HasNumber(string name) { ... } public Action DoesntHaveNumer(string name) { ... } 根据name参数的值,是否可以创建这样的路由,使其命中其中一个或另一个 例如: myApp/Home?name=qwe 将击中多斯文努默 myApp/Home?名称=q2e 我会打电话的 名称是一个必需参数默认路由类不与查询字符串交互。但是,您可以继承它以添加其他功能 using Syst

我有两个动作

public Action HasNumber(string name) { ... }

public Action DoesntHaveNumer(string name) { ... }
根据name参数的值,是否可以创建这样的路由,使其命中其中一个或另一个

例如:

myApp/Home?name=qwe 将击中多斯文努默

myApp/Home?名称=q2e 我会打电话的


名称是一个必需参数

默认路由类不与查询字符串交互。但是,您可以继承它以添加其他功能

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

public class NumericCheckingQueryStringValueRoute : Route
{
    private readonly string queryStringKey;
    private readonly RouteValueDictionary defaultsIfNumeric;
    private readonly RouteValueDictionary defaultsIfNonNumeric;

    public NumericCheckingQueryStringValueRoute(
        string url,
        string queryStringKey,
        object defaultsIfNumeric,
        object defaultsIfNonNumeric)
        : base(url, new MvcRouteHandler())
    {
        this.queryStringKey = queryStringKey;
        this.defaultsIfNumeric = new RouteValueDictionary(defaultsIfNumeric);
        this.defaultsIfNonNumeric = new RouteValueDictionary(defaultsIfNonNumeric);
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var result = base.GetRouteData(httpContext);

        // If it matches, the result will be non-null
        if (result != null)
        {
            var newResult = new RouteData(this, new MvcRouteHandler());

            // Copy the route values from the base class
            foreach (var value in result.Values)
            {
                newResult.Values[value.Key] = value.Value;
            }
            // Copy the data tokens from the base class
            foreach (var token in result.DataTokens)
            {
                newResult.DataTokens[token.Key] = token.Value;
            }

            var requestQueryString = httpContext.Request.QueryString;

            var queryStringValue = requestQueryString[this.queryStringKey];

            if (string.IsNullOrEmpty(queryStringValue))
            {
                return null;
            }

            RouteValueDictionary defaultsToUse;
            if (ContainsDigits(queryStringValue))
            {
                defaultsToUse = this.defaultsIfNumeric;
            }
            else
            {
                defaultsToUse = this.defaultsIfNonNumeric;
            }

            // Copy the numeric defaults to route values
            foreach (var value in defaultsToUse)
            {
                newResult.Values[value.Key] = value.Value;
            }

            // We matched, return the result
            return newResult;
        }

        // Return null if no match
        return null;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        // We just pass this through. If you add the value as a route value
        // when building ActionLink or RouteLink, it will automatically make
        // it into a query string value because it is not part of the url argument.
        return base.GetVirtualPath(requestContext, values);
    }

    // Fastest way to check for digits
    // http://stackoverflow.com/questions/7461080/fastest-way-to-check-if-string-contains-only-digits
    private bool ContainsDigits(string str)
    {
        foreach (char c in str)
        {
            if (c >= '0' && c <= '9')
                return true;
        }

        return false;
    }
}
要构建到页面的链接,需要将查询字符串值添加到route values集合中。你应该使用RouteLink,因为你有两种不同的动作方法

@Html.RouteLink("Link with number", "CheckNumericName", new { name = "q2e" })
@Html.RouteLink("Link with no number", "CheckNumericName", new { name = "qwe" })

为什么不在重定向前检查,首先确定正确的path@EuphoriaGrogi在重定向之前,你是什么意思?在此处找到一个答案:
@Html.RouteLink("Link with number", "CheckNumericName", new { name = "q2e" })
@Html.RouteLink("Link with no number", "CheckNumericName", new { name = "qwe" })