为默认值“”传递一个非数字值;id”;MVC控制器中的参数

本文关键字:id 数字 MVC 控制器 参数 一个 默认值 | 更新日期: 2023-09-27 18:27:47

我有一个相当简单的设置,我正在创建一个MVC网站来显示客户的详细信息。对于客户来说,唯一的id是他们的非数字电子邮件地址。所以在我的ROuteConfig.cs中,我有默认的路由

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

在我的控制器"客户控制器"中,我有这个动作

public ActionResult Details(string id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            CustomerModel customerModel = _customerManager.GetCustomer(id);
            if (customerModel == null)
            {
                return HttpNotFound();
            }
            return View(customerModel);
        }

现在,当我导航到此url 时

http://localhost:45826/customer/Details/someemail%40web.com

路由基础结构不会在我的控制器上调用操作"详细信息",但是如果我导航到这个url

http://localhost:45826/customer/Details/5

则该操作是invoke,传入id参数的值5。

如果我稍微更改一下URL并使用以下语法

http://localhost:45826/customer/Details?id=fromweb%40web.com

再次调用该操作,将电子邮件地址正确地传递给id参数。

有人能帮助理解为什么非数字值没有按预期映射到操作吗?

我也尝试过在默认路由之前添加这个路由,但这也不起作用,我得到了相同的结果

routes.MapRoute(
            name: "ViewCustomer",
            url: "customer/details/id",
            defaults: new { controller = "Customer", action = "Details", id = "" }
            );

为默认值“”传递一个非数字值;id”;MVC控制器中的参数

将其添加到web.config中:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">

阅读:https://stackoverflow.com/a/49831093/10299573