Я знаю, что если вы думаете, что нашли ошибку в .NET framework, вы, скорее всего, ошибаетесь, но именно поэтому я пишу этот вопрос, поэтому, пожалуйста, выслушайте меня .
Я почти уверен, что существует разница между маршрутами в .NET 3.5 и .NET 4.0, когда дело доходит до необязательных параметров. В частности, если у вас есть более одного необязательного параметра в вашем маршруте. Мне не удалось найти это критическое изменение, отмеченное в каких-либо примечаниях к выпуску .NET 4.0 или MVC 3, поэтому я называю это ошибкой.
РЕДАКТИРОВАТЬ: Эта ошибка проявляется только при попытке сборки URL-адрес маршрута с использованием кода, такого как URL-адрес или помощники html в mvc. Если вы действительно запрашиваете URL-адрес в браузере, в реальном приложении mvc, он работает нормально. Итак, если бы мое тестовое приложение ниже было реальным приложением mvc, не было бы проблем, если бы вы попытались запросить '/root/test1'.[12127 sizes Что мне нужно, чтобы вы сделали, это запустить следующую тестовую программу, она должна быть справедливой не требует пояснений, но в основном он просто устанавливает маршрут с некоторыми необязательными параметрами.
Создание нового консольного приложения .NET 4
Измените целевую структуру на «.NET Framework 4» вместо «.
System.Web 4.0
System.Web.Routing 4.0
System.Web.Mvc 3.0
Вставьте следующий код в файл 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 ();
}
}
Запустите программу и обратите внимание на полученные URL.
На моей машине результат:
Тест 1: сбой (ожидалось '/ root / test1', но было '')
Тест 2: Успех ('/ root / test1 / test2')
Тест 3: Успех ('/ root / test1 / test2 / test3')
Теперь измените целевую платформу на .NET 3.5, добавьте ссылки на:
System.Web.Mvc 2.0
System.Web.Routing 3.5
System.Web.Abstrations 3.5
Запустите программу еще раз и убедитесь, что все 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, если вы думаю, что что-то не так в тестовой программе.