【问题标题】:How to reroute when entering an incorrect URL on address bar在地址栏输入错误的 URL 时如何重新路由
【发布时间】:2026-02-20 09:45:02
【问题描述】:

我有一个至少有两个控制器的 Asp.net MVC Web 应用程序。提交时有第一个表单将激活第一个控制器的 Create post action 方法(将父详细信息保存到 db 中),然后重定向到 Create get action 方法,然后显示一个表单以填写子实体。这意味着我必须将父 ID 作为参数传递给我正在执行的控制器,并成功地将其作为外键保存到子表中。我的问题是我不知道如何阻止某人直接在地址栏上输入子表单的 URL,而没有从父表单生成的所需父 ID(例如https://localhost/controller2/Create)。我正在考虑每当有人这样做时都会重定向回父表单的路由,但不确定代码中的方式。

【问题讨论】:

  • 请显示您已完成的代码。表现出一些努力:)

标签: c# asp.net-mvc url-routing


【解决方案1】:

我假设您在Controller1Create 方法中使用了RedirectToAction 重定向到Controller2Create

在这种情况下,如果您的目标是阻止访问 CreateController2,那么您必须在操作本身内应用一些逻辑来检查传入参数的有效性。

例如,您将 parentId 作为参数传递给此 GET Create 方法。所以你可以这样做:

public ActionResult Create(string parentId)
{
    if(parentId == null)
    {
        //return some error code like 404 with corresponding error view
    }
    else
    {
        //check if parentId is a valid one and perform the logic as usual
    }
}

【讨论】:

  • 我上面写的代码只是为了解释我想说的。由于您没有提供问题中操作方法的签名,因此我继续执行此实现。想法是在现有的操作方法中有一个if 条件,该方法检查输入参数中的null。由于您的评论表明您有一个 int 类型作为输入参数。您应该尝试将其更改为 int? 以解决错误。
  • 感谢 akg,但不幸的是,这样做时它给了我一个错误('参数字典包含方法'System.Web'的不可空类型'System.Int32'的参数'Id'的空条目.Mvc.ActionResult Create(Int32).') 当调试它并在 controller2 的 Create 方法的开始处放置一个断点时,它甚至没有达到这个意思,我无法捕捉到这个错误,因为它发生在控制器加载之前。这就是为什么我最初认为当用户手动输入此 URL 或从地址历史列表中选择它时,它应该始终重新路由到 controller1。
  • 如果你能提供一些代码示例来说明你是如何实现控制器1创建方法和控制器2创建方法的,那将非常有帮助