2009-09-27 7 views
8

Я создал таблицу в базе данных, которая имеет System.Guid, поскольку это первичный ключ. Создана необходимая модель ADO.Net Entity Framework и отображены необходимые хранимые процедуры.Использование System.Guid в качестве первичного ключа в ASP.Net MVC?

Я создал новый контроллер и добавил базовый обязательный код для создания и редактирования данных. Тем не менее, когда щелчок по ссылке, чтобы изменить конкретную запись генерируется следующее сообщение об ошибке:

The parameters dictionary contains a null entry for parameter '[MyId]' of non-nullable type 'System.Guid' for method 'System.Web.Mvc.ActionResult Edit(System.Guid)' in '[MySite].[MyController].[SpecificController]'. To make a parameter optional its type should be either a reference type or a Nullable type. Parameter name: parameters

Редактирование действия объявляется в контроллере следующим образом:

public ActionResult Edit(Guid itemId) 
{ 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(MyItem itemToModify) 
{ 

} 

При добавлении новой запись нового Guid создается с помощью хранимой процедуры, и в списке отображается правильный Guid. Url также передает правильный Guid для извлечения.

Я не могу понять, в какой точке это не удается, но как мне пойти с передачей System.Guid в качестве параметра для контроллера?

ответ

17

Если вы не обновили свои маршруты, он ожидает (по умолчанию) конечного параметра в маршруте, который будет называться «id». То есть, если у вас есть маршрут, например/specific/edit/5646-0767 -..., он будет отображать guid в словаре значений маршрута с ключом «id» независимо от того, какой параметр в вашем методе назван. Я бы следовать этому соглашению и изменить определение метода для:

public ActionResult Edit(Guid id) 

Вы можете обойти эту проблему, явно указав имя параметра маршрута, но вы в конечном итоге с URL, который выглядит примерно так:/специфические/редактировать? Itemid = 5646-0767 -...

+0

Теперь я чувствую себя глупо, спрашивая :( – BinaryMisfit

+0

Не волнуйся об этом - единственная причина, по которой я знал ответ, - это то же самое, что и я, и должен был понять это. – tvanfosson

4

Ввод образца кода ниже для тех, кто может понадобиться (я уверен, сделал)

 public ActionResult Profile(Guid? id) 
    { 
     if (!id.HasValue) 
     { 
      return View(new ProfileRepository().GetUserProfile(User.Identity.Name)); 
     } 

     return View(new ProfileRepository().GetUserProfile(id.Value)); 

    } 

Спасибо за Anwer выше, что привело меня в правом направление

Смежные вопросы