2009-09-27 13 views
8

Utworzyłem tabelę w bazie danych, która ma klucz System.Guid jako swój klucz podstawowy. Wymagany model ADO.Net Entity Framework został wygenerowany i zmapowano wymagane procedury składowane.Korzystanie z System.Guid jako klucz podstawowy w ASP.Net MVC?

Utworzono nowy kontroler i dodano podstawowy wymagany kod do tworzenia i edycji danych. Jednakże gdy kliknięcie na link, aby edytować konkretny zapis następujący błąd jest generowany:

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

Akcja edycja została zadeklarowana w sterowniku, co następuje:

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

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

} 

Podczas dodawania nowego nagraj nowy Guid jest generowany za pomocą procedury zapisanej, a na liście wyświetla się poprawny Guid. Url przekazuje również prawidłowe Guid do wyszukiwania.

Nie mogę uchwycić punktu, w którym to się nie powiedzie, ale w jaki sposób chciałbym przejść do przekazywania wartości System.Guid jako parametru do kontrolera?

Odpowiedz

17

O ile nie zaktualizowałeś swoich tras, oczekuje się (domyślnie) ostatniego parametru na trasie o nazwie "id". Oznacza to, że jeśli masz trasę taką jak/specific/edit/5646-0767 -..., mapuje ona guid na słownik wartości trasy za pomocą klucza "id", niezależnie od tego, jaki parametr w metodzie zostanie nazwany. będę śledzić tę konwencję i zmienić definicję metody do:

public ActionResult Edit(Guid id) 

Można obejść ten problem, poprzez wyraźne określenie nazwy parametru trasy, ale potem kończy się z adresem URL, który wygląda tak:/specyficzny/edit? ItemID = 5646-0767 -...

+0

Teraz czuję się głupio, gdy pytam :( – BinaryMisfit

+0

Nie przejmuj się tym - jedynym powodem, dla którego wiedziałem, że odpowiedź brzmi: zrobiłem to samo raz i musiałem to rozgryźć. – tvanfosson

4

Umieszczenie przykładowy kod poniżej dla każdego, kto może potrzebować (na pewno nie)

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

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

    } 

Dziękuję za anwer powyżej, co doprowadziło mnie w prawo kierunek

Powiązane problemy