10 Stimmen

Verwendung einer System.Guid als Primärschlüssel in ASP.Net MVC?

Ich habe eine Tabelle in der Datenbank erstellt, die eine System.Guid als Primärschlüssel hat. Das erforderliche ADO.Net Entity Framework Modell wurde generiert und die erforderlichen gespeicherten Prozeduren wurden zugewiesen.

Ich habe einen neuen Controller erstellt und den grundlegenden erforderlichen Code zum Erstellen und Bearbeiten der Daten hinzugefügt. Wenn Sie jedoch auf den Link klicken, um einen bestimmten Datensatz zu bearbeiten, wird der folgende Fehler erzeugt:

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

Die Bearbeitungsaktion wird im Controller wie folgt deklariert:

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

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

}

Beim Hinzufügen eines neuen Datensatzes wird die neue Guid über eine Stored Procedure generiert und die Liste zeigt die korrekte Guid an. Die Url übergibt ebenfalls die korrekte Guid für den Abruf.

Ich kann nicht scheinen, um den Punkt zu erfassen, an dem dies fehlschlägt, aber wie würde ich über die Übergabe einer System.Guid als Parameter an den Controller gehen?

18voto

tvanfosson Punkte 506878

Sofern Sie Ihre Routen nicht aktualisiert haben, erwartet es (standardmäßig), dass der letzte Parameter in einer Route "id" heißt. Das heißt, wenn Sie eine Route wie /specific/edit/5646-0767-... haben, wird die Guid in das Werteverzeichnis der Route mit dem Schlüssel "id" gemappt, unabhängig davon, wie der Parameter Ihrer Methode heißt. Ich würde diese Konvention befolgen und die Methodendefinition ändern in:

public ActionResult Edit(Guid id)

Man kann dies umgehen, indem man den Namen des Routenparameters explizit angibt, aber dann erhält man eine URL, die wie folgt aussieht: /specific/edit?itemid=5646-0767-...

0 Stimmen

Machen Sie sich keine Sorgen - ich weiß die Antwort nur, weil ich das Gleiche schon einmal gemacht habe und es herausfinden musste.

4voto

Geovani Martinez Punkte 1983

Nachstehend ein Beispielcode für alle, die ihn benötigen (ich habe ihn auf jeden Fall)

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

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

    }

Vielen Dank für die Antwort, die mich in die richtige Richtung geführt hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X