查询字符串参数的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" })