ASP.NET MVC Маршрутизация?// UrlParamter.Optional Vs Пустая строка - PullRequest
0 голосов
/ 15 декабря 2018

Какая разница между этими двумя маршрутами?

&

Эти два маршрута одинаковы?

//Route 1.
routes.MapRoute("SampleRounteOne" , "{controller}/{action}/{id}" , new {id = UrlParamter.Optional})

//Route 2.
routes.MapRoute("SampleRounteTwo" , "{controller}/{action}/{id}" , new {id = ""})

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Нет! Эти два маршрута не совпадают.

//Route1
route.MapRoute("Route1" , "{controller}/{action}/{id}" , new { id = UrlParameter.Optional});

То же самое можно также сделать, установив для id пустую строку: {id: ""}

например:

//Route 2.
routes.MapRoute("Route2" , "{controller}/{action}/{id}" , new {id = ""})

Это выглядит очень коротко / кратко, так почему бы нам не использовать это?

В чем разница?

Первое:

Вы спрашиваете: эти два маршрута одинаковы?

Нет !эти два маршрута не одинаковы.

Теперь перейдем к точке!

Какая разница между этими двумя маршрутами?

Когда мы набираемЗначения параметров URL разбираются из URL и помещаются в словарь?

Теперь, когда мы используем UrlParameter.Optional в качестве значения по умолчанию, и в URL не указывается никакого значения, маршрутизация даже не добавляет запись в словарь.Если в качестве значения по умолчанию задана пустая строка, словарь значений маршрута будет содержать значение с ключом «id» и значение в виде пустой строки.В некоторых случаях это различие важно, поскольку оно позволяет узнать разницу между id , который не указан, и указанным, но оставленным пустым.

0 голосов
/ 15 декабря 2018

Теоретически:

В Route1 у вас есть параметр, который объявлен как UrlParameter.Optional, который, например, равен необязательно .

В Route2 для вашего параметра по умолчанию установлено значение "", которое является пустой строкой.

Практически:

Вкл. Route1,ваш параметр будет иметь значение Nullable, поэтому значение по умолчанию будет null, когда вы передаете его в контроллер.Таким образом, у вас будет такая реализация:

public void MyController(string? id)
{
    //dowork
}

При Route2 ваш параметр будет не-Nullable типа, который по умолчанию будет иметь значение "" на вашем контроллере,пустой string.Ваш контроллер будет выглядеть следующим образом:

public void MyController(string id = "")
{
    //dowork
}
...