【问题标题】:MVC Controller Not Receiving Parameter ValuesMVC 控制器未接收参数值
【发布时间】:2018-07-25 21:31:18
【问题描述】:

无论我如何格式化我的 URL,我都会得到一个空参数异常。我已经尝试了我现在能想到的所有方法。它正在工作,然后它就停止了。所以我恢复了我上次的更改,看看是否修复了它,但它没有。现在,即使在以前的(工作)副本中,它也不起作用。我也遇到了编译器错误,所以我清理了解决方案,重新构建,重新启动了我的机器(和 VS),但仍然没有。

这不是路由映射的问题。当我尝试搜索我的问题时,我只能找到这些。为了确定,我确实玩了很多次。

我收到以下错误消息:

参数字典包含参数“id”的空条目 方法的不可为空的类型“System.Guid” 'System.Web.Mvc.ActionResult ViewJobs(System.Guid)' 在 'MyProject.Controllers.RecruitingController'。可选参数 必须是引用类型、可空类型或声明为 可选参数。参数名称:参数

我的方法看起来像这样(很典型):

public class RecruitingController : Controller
{
    public ActionResult ViewJobs(Guid id)
    {
        var ListView = RecruitingLogic.GetListView(id);
        return View("ViewJobs", ListView);
    }
}

注意:我尝试将其更改为可为空的 guid,但没有成功。老实说,我没想到会这样。我还尝试将动作移动到另一个控制器。那也没用。

注意 2:我确实观察到这是空的。这不是无效的错误消息。我还设置了动作/参数日志记录作为动作过滤器,因此我能够回顾并找到它停止工作的确切时间。您可以看到该操作接收非空值,然后 bam,它就停止了。

路线映射:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

在网址方面,我尝试了很多。然而,这些是为我工作的少数……直到他们停止了。

https://localhost:12345/recruiting/viewjobs/B77A156-622C-E811-80D4-005056865C51 https://localhost:12345/recruiting/viewjobs?id=B77A156-622C-E811-80D4-005056865C51 https://localhost:12345/recruiting/viewjobs/?id=B77A156-622C-E811-80D4-005056865C51

我现在很茫然。任何建议表示赞赏。

【问题讨论】:

    标签: asp.net-mvc model-view-controller .net-4.6.1


    【解决方案1】:

    由于路由配置有小写id,能否更新动作签名使用小写id参数试试。

    public ActionResult ViewJobs(Guid id)
    

    【讨论】:

    • 我已经试过了。抱歉,我在发布初始帖子时不记得所有内容。不幸的是,这没有奏效。除了在控制器和路由映射中更改大小写之外,我还尝试更改参数的可空性。
    • DefaultModelBinder不区分大小写。
    【解决方案2】:

    您可能将可选 URL 参数 (UrlParameter.Optional) 与操作方法本身的可选参数混淆了。路由表正在尝试查找允许可选 id 参数的操作,但 Guid 默认情况下不可为空。试试

    public class RecruitingController : Controller
    {
        public ActionResult ViewJobs(Guid? id)
        {
            var ListView = RecruitingLogic.GetListView(id);
            return View("ViewJobs", ListView);
        }
    }
    

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index"}
    );
    

    【讨论】:

    • 正如我最初的帖子中所述,我已经尝试过了。事实上,我什至按照您的建议使用了路线映射。我知道很难相信它不起作用。我也很难过,因为我以前从未遇到过这个问题。如果我使 guid 可以为空,它仍然会传入 null。它可能会摆脱系统生成的异常,但该值不应为 null 开始。因此,不幸的是,这并不能解决问题。不过感谢您的建议。
    • 对不起,我错过了你说你尝试过可为空值的地方,但在第二次阅读时,我不确定你是否也尝试过删除 UrlParameter.Optional 标志。您是否尝试过任何其他定义默认路由的机制,例如app.UseMvcWithDefaultRoute();?我能理解你的沮丧——这看起来是一个相当普遍的问题(我可以看到其他一些非常接近重复的问题,但我不希望这样标记你的问题)。你能单独重现问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多