gpt4 book ai didi

.net-4.0 - 任何人都可以在 .NET 4.0/MVC3 中重新创建我在具有 2 个或更多可选参数的路由中遇到的以下错误吗?

转载 作者:行者123 更新时间:2023-12-04 15:04:09 25 4
gpt4 key购买 nike

我知道如果您认为您在 .NET 框架中发现了一个错误,那么您很可能是错的,但这就是我写这个问题的原因,所以请听我说。

我相当肯定 .NET 3.5 和 .NET 4.0 中的路由在可选参数方面存在差异。特别是如果您的 route 有多个可选参数。我无法在 .NET 4.0 或 MVC 3 的任何发行说明中找到这一重大更改,因此我将其称为错误。

编辑:此错误仅在您尝试使用 mvc 中的 url 或 html helper 之类的代码构建路由 url 时才会出现。如果您实际上在浏览器中请求 url,在实际的 mvc 应用程序中,它工作得很好。因此,如果我下面的测试应用程序是实际的 mvc 应用程序,那么如果您尝试请求“/root/test1”,就不会有问题。

我需要你做的是运行以下测试程序,它应该是不言自明的,但基本上它只是设置了一个带有一些可选参数的路由。

  • 创建新的 .NET 4 控制台应用程序
  • 将目标框架更改为“.NET Framework 4”而不是“.NET Framework 4 Client Profile”
  • 添加对以下内容的引用:
    系统.Web 4.0
    System.Web.Routing 4.0
    System.Web.Mvc 3.0
  • 将以下代码粘贴到 program.cs 文件中,覆盖之前的所有内容:
    using System;
    using System.IO;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;

    public class Program
    {
    static void Main()
    {
    var httpCtx = new HttpContextWrapper(new HttpContext(new HttpRequest(null, "http://localhost/", null), new HttpResponse(new StringWriter())));

    var routes = RouteTable.Routes;
    routes.MapRoute("Test", "root/{test1}/{test2}/{test3}", new { test2 = UrlParameter.Optional, test3 = UrlParameter.Optional });

    var context = new RequestContext(httpCtx , new RouteData());

    var url = new UrlHelper(context);

    var expected1 = "/root/test1";
    var expected2 = "/root/test1/test2";
    var expected3 = "/root/test1/test2/test3";

    var actual1 = url.RouteUrl("Test", new { test1 = "test1" });
    var actual2 = url.RouteUrl("Test", new { test1 = "test1", test2 = "test2" });
    var actual3 = url.RouteUrl("Test", new { test1 = "test1", test2 = "test2", test3 = "test3" });

    var result1 = actual1 == expected1;
    var result2 = actual2 == expected2;
    var result3 = actual3 == expected3;

    Console.WriteLine("Test 1: {0} ({1})", result1 ? "Success" : "Fail", result1 ? string.Format("'{0}'", actual1) : string.Format("Expected '{0}' but was '{1}'", expected1, actual1 ?? "<null>"));
    Console.WriteLine("Test 2: {0} ({1})", result2 ? "Success" : "Fail", result2 ? string.Format("'{0}'", actual2) : string.Format("Expected '{0}' but was '{1}'", expected2, actual2 ?? "<null>"));
    Console.WriteLine("Test 3: {0} ({1})", result3 ? "Success" : "Fail", result3 ? string.Format("'{0}'", actual3) : string.Format("Expected '{0}' but was '{1}'", expected3, actual3 ?? "<null>" ));
    Console.ReadLine();
    }
    }
  • 运行程序,并注意生成的 url。
    在我的机器上,结果是:
    Test 1: Fail    (expected '/root/test1' but was '<null>')
    Test 2: Success ('/root/test1/test2')
    Test 3: Success ('/root/test1/test2/test3')
  • 现在将目标框架更改为 .NET 3.5 添加对以下内容的引用:
    系统.Web.Mvc 2.0
    System.Web.Routing 3.5
    System.Web.Abstrations 3.5
  • 再次运行程序,看到3个测试用例都成功了。
    这次的结果是:
    Test 1: Success ('/root/test1')  
    Test 2: Success ('/root/test1/test2')
    Test 3: Success ('/root/test1/test2/test3')

  • 所以在我看来 .NET 4 或 MVC 3 中存在一个错误。如果您发现相同的问题,请在连接中对以下问题进行投票: https://connect.microsoft.com/VisualStudio/feedback/details/630568/url-routing-with-two-optional-parameters-unspecified-fails-on-asp-net-mvc3-rc2#details

    如果您认为测试程序中存在问题,请随时在常规 MVC 应用程序中对此进行测试。

    最佳答案

    所以,Phil Haack 刚刚发布了一个 blog post详细说明这是一个已知问题,将在 .NET 框架的下一个版本中修复,或者如果我们幸运地修复了特定 dll 的错误。我不确定他们将如何修复它。他们是否会取缔超过 1 个可选参数,或者他们是否会按照我在 Darin 回答的评论中概述的方式解决它。至少他们知道这一点,并且可以采取措施在 future 使用多个可选参数来指定预期的行为。

    关于.net-4.0 - 任何人都可以在 .NET 4.0/MVC3 中重新创建我在具有 2 个或更多可选参数的路由中遇到的以下错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4846022/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com