Возможно ли иметь Guid в качестве необязательного параметра в действии контроллера asp.net mvc 3? - PullRequest
17 голосов
/ 01 марта 2011

Я пытался выполнить индексное действие на контроллере, чтобы по желанию использовать guid, например так:

public ActionResult Index(Guid id = default(Guid))

или около того

public ActionResult Index(Guid id = new Guid())

Я надеялся воспользоватьсяНеобязательные параметры C # и мои маршруты также определяются необязательными параметрами:

routes.MapRoute(
    "Default", "{controller}/{action}/{id}",
     new { controller = "somecontroller", action = "Index", id = UrlParameter.Optional }

, но при вызове somecontroller / index выдается следующая ошибка ...

Словарь параметров содержит пустую записьдля параметра 'id' ненулевого типа 'System.Guid' для метода 'System.Web.Mvc.ActionResult Index (System.Guid)' в 'Controllers.SomeController'.Необязательный параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр

это просто невозможно?Что мне не хватает?Спасибо

1 Ответ

30 голосов
/ 01 марта 2011

Гид не обнуляется. Например, вы не можете сделать это

Guid myGuid = null;  // invalid

Однако в C # 2 был добавлен некоторый синтаксический сахар, чтобы сделать типы значений обнуляемыми (оборачивая их в объект Nullable), например так:

Guid? myGuid = null; // valid.  myGuid will be Nullable<Guid>.

Учитывая это правило, давайте посмотрим на ваш маршрут:

routes.MapRoute(
    "Default", "{controller}/{action}/{id}",
    new { controller = "somecontroller",
        action = "Index",
        id = UrlParameter.Optional // <-- Optional!!
    });

Поскольку вы указали в своем маршруте, что параметр id является необязательным, вы должны использовать тип, который может быть null, или , вы должны полностью опустить параметр в своем действии. Поэтому, чтобы исправить свое действие, вам нужно изменить параметр Guid id на Guid? id, и он должен работать. После этого вы можете проверить значение, чтобы убедиться, что оно не равно нулю, например:

public ActionResult Index(Guid? id) {
    if (id.HasValue) {
        // it's not null, so I can call "id.Value" to get the Guid
    }
}
...