【问题标题】:Is it possible to enable some static checking for tag helpers?是否可以为标签助手启用一些静态检查?
【发布时间】:2017-10-28 19:36:19
【问题描述】:

例如我可以在默认的 mvc 模板中编写这段代码

<a asp-area="" asp-route-returnUrlFoo="foo" 
   asp-controller="Account" asp-action="RegisterFoo">Register</a>

而且会生成不正确的url

/Account/RegisterFoo?returnUrlFoo=foo

当动作名称或路由参数不正确时是否可能抛出错误?

【问题讨论】:

  • 要明确.../Account 是有效的Controller/RegisterFoo 是无效的Action?此外,您希望您的主机抛出异常?或者您的意思是,使用特定的状态代码(例如 400 - Bad Request)进行响应?
  • @Svek 是的,RegisterFoo 是无效的操作。是的,抛出异常。

标签: razor asp.net-core asp.net-core-mvc tag-helpers


【解决方案1】:

后备方法:“通用”处理不匹配的控制器和操作

您可以添加一个新路由,将所有无效请求重定向到您自己的特定控制器和操作:

app.UseMvc(routes =>
{
    // your other routes here

    routes.MapRoute(_
        name: "Fallback",
        url: "{*any}",
        defaults: new { controller = "Error", action = "Handler"});
}

在上述情况下,这会将所有(未定义的)映射到/Error/Handler。您可以对其进行修改以满足您自己的要求。

您可以在此处阅读有关路线模板的更多信息:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing#route-template-reference


替代方案:按控制器处理

当然,还有一种替代方法是仅在控制器的基础上处理它。这种方法不太通用,可以让您创建更有针对性的方法来处理 URI / 路由错误。

备选方案:检查控制器或动作是否存在

string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();

【讨论】:

  • 我不想让/Account/RegisterFoo?returnUrlFoo=foo 工作,因为这个网址不正确。我只想要一个例外。
  • @ais 你的控制器可以抛出异常。
  • 我希望在呈现带有此 url 的页面时出现异常
  • @ais 我为您添加了另一种可能的替代方案,您可以使用它。这将允许您将错误检查准确地放置在您想要的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2020-03-12
相关资源
最近更新 更多