Подтвердить что ты не робот

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

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

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

или так нравится

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

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

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

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

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

Это просто невозможно? Что мне не хватает? Благодаря

4b9b3361

Ответ 1

A Guid не имеет значения NULL. Например, вы не можете этого сделать

Guid myGuid = null;  // invalid

Однако в С# 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, и он должен работать. После этого вы можете проверить значение, чтобы убедиться, что оно не равно null:

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