问题:我们正在从旧系统升级,因此解决方案受到限制。如果存在特定的查询字符串,我正在尝试路由到未经授权的控制器。如果不存在,则将用户路由到授权控制器。这是在 ASP.Net Core 2.1 上。
是否可以将控制器设置为基于查询字符串进行路由?我试过了
[/home/[action]?query={query}] -> 由于“?”导致运行时错误
[/home/[action]/{query}] - > 映射到 /home/index/1 (不是我需要的)
谢谢你的帮助!
编辑:或者,是否可以有一个单独的控制器 Action 取决于查询参数?
public IActionResult Index(){}
public IActionResult Index([FromQuery]string query){}
Run Code Online (Sandbox Code Playgroud)
路由似乎没有区分这两者。
您可以为此使用IActionConstraint和IParameterModelConvention接口。简而言之,像这样创建一个 IActionConstraint:
public class RequiredFromQueryActionConstraint : IActionConstraint
{
private readonly string _parameter;
public RequiredFromQueryActionConstraint(string parameter)
{
_parameter = parameter;
}
public int Order => 999;
public bool Accept(ActionConstraintContext context)
{
if (!context.RouteContext.HttpContext.Request.Query.ContainsKey(_parameter))
{
return false;
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
如果在请求的查询字符串中没有找到匹配的参数,那么它将从 Accept 方法返回 false。
比创建这样的RequiredFromQueryAttribute类:
public class RequiredFromQueryAttribute : FromQueryAttribute, IParameterModelConvention
{
public void Apply(ParameterModel parameter)
{
if (parameter.Action.Selectors != null && parameter.Action.Selectors.Any())
{
parameter.Action.Selectors.Last().ActionConstraints.Add(new RequiredFromQueryActionConstraint(parameter.BindingInfo?.BinderModelName ?? parameter.ParameterName));
}
}
}
Run Code Online (Sandbox Code Playgroud)
比你可以用这个属性装饰你的强制性查询字符串参数:
[Route("api/[controller]")]
public class ValuesController : Controller
{
[HttpGet("{id}")]
public string Get(int id, [RequiredFromQuery]string foo, [RequiredFromQuery]string bar)
{
return id + " " + foo + " " + bar;
}
}
Run Code Online (Sandbox Code Playgroud)
从现在开始,只有以下 URL GETapi/values/5?foo=a&bar=b将导致上述操作,所有其他参数组合将导致响应 status 404,您最终可以将其替换为您想要的。
您可以在此链接中找到更多信息https://www.strathweb.com/2016/09/required-query-string-parameters-in-asp-net-core-mvc/
| 归档时间: |
|
| 查看次数: |
2779 次 |
| 最近记录: |