Может ли кто-нибудь воссоздать следующую ошибку I ' m сталкивается с маршрутами с 2 или более необязательными параметрами в .NET 4.0 / MVC3?

Я знаю, что если вы думаете, что нашли ошибку в .NET framework, вы, скорее всего, ошибаетесь, но именно поэтому я пишу этот вопрос, поэтому, пожалуйста, выслушайте меня .

Я почти уверен, что существует разница между маршрутами в .NET 3.5 и .NET 4.0, когда дело доходит до необязательных параметров. В частности, если у вас есть более одного необязательного параметра в вашем маршруте. Мне не удалось найти это критическое изменение, отмеченное в каких-либо примечаниях к выпуску .NET 4.0 или MVC 3, поэтому я называю это ошибкой.

РЕДАКТИРОВАТЬ: Эта ошибка проявляется только при попытке сборки URL-адрес маршрута с использованием кода, такого как URL-адрес или помощники html в mvc. Если вы действительно запрашиваете URL-адрес в браузере, в реальном приложении mvc, он работает нормально. Итак, если бы мое тестовое приложение ниже было реальным приложением mvc, не было бы проблем, если бы вы попытались запросить '/root/test1'.[12127 sizes Что мне нужно, чтобы вы сделали, это запустить следующую тестовую программу, она должна быть справедливой не требует пояснений, но в основном он просто устанавливает маршрут с некоторыми необязательными параметрами.

  1. Создание нового консольного приложения .NET 4

  2. Измените целевую структуру на «.NET Framework 4» вместо «. System.Web 4.0
    System.Web.Routing 4.0
    System.Web.Mvc 3.0

  3. Вставьте следующий код в файл program.cs, перезаписав все предыдущее содержимое:

     using System;
    используя System.IO;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    Программа публичного класса
    {
     статическая пустота Main ()
     {
     var httpCtx = new HttpContextWrapper (новый HttpContext (новый HttpRequest (null, "http: // localhost /", null), новый HttpResponse (новый 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 = новый UrlHelper (контекст);
    
     var expected1 = "/ корень / test1";
     var expected2 = "/ корень / test1 / test2";
     var expected3 = "/ корень / 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"});
    
     вар результат1 = фактический1 == ожидаемый1;
     вар результат2 = фактический2 == ожидаемый2;
     вар результат3 = фактический3 == ожидаемый3;
    
     Console.WriteLine ("Test 1: {0} ({1})", result1? "Success": "Fail", result1? String.Format ("'{0}'", actual1): string.Format (" Ожидалось '{0}', но было '{1}' ", expected1, actual1 ??"  "));
     Console.WriteLine ("Test 2: {0} ({1})", result2? "Success": "Fail", result2? String.Format ("'{0}'", actual2): string.Format (" Ожидалось '{0}', но было '{1}' ", expected2, actual2 ??"  "));
     Console.WriteLine ("Test 3: {0} ({1})", result3? "Success": "Fail", result3? String.Format ("'{0}'", actual3): string.Format (" Ожидалось '{0}', но было '{1}' ", expected3, actual3 ??"  "));
     Console.ReadLine ();
     }
    }
    
  4. Запустите программу и обратите внимание на полученные URL.
    На моей машине результат:

     Тест 1: сбой (ожидалось '/ root / test1', но было '')
    Тест 2: Успех ('/ root / test1 / test2')
    Тест 3: Успех ('/ root / test1 / test2 / test3')
    
  5. Теперь измените целевую платформу на .NET 3.5, добавьте ссылки на:
    System.Web.Mvc 2.0
    System.Web.Routing 3.5
    System.Web.Abstrations 3.5

  6. Запустите программу еще раз и убедитесь, что все 3 тестовых примера выполнены успешно.
    На этот раз результат:

     Тест 1: Успех ('/ root / test1') 
    Тест 2: Успех ('/ root / test1 / test2') 
    Тест 3: Успех ('/ 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, если вы думаю, что что-то не так в тестовой программе.

6
задан JohannesH 30 January 2011 в 22:39
поделиться