2009-09-27 19 views
8

He creado una tabla en la base de datos que tiene un System.Guid como clave principal. Se ha generado el modelo requerido de ADO.Net Entity Framework y se han asignado los procedimientos almacenados necesarios.¿Cómo utilizar un System.Guid como clave principal en ASP.Net MVC?

Creé un nuevo controlador y agregué el código requerido básico para Crear y Editar para los datos. Sin embargo, cuando el clic en el enlace para editar el un registro en particular se genera el siguiente error:

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

La acción de edición se declara en el controlador de la siguiente manera:

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

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

} 

Al añadir un nuevo registrar el nuevo Guid se genera a través de un Procedimiento almacenado y la lista muestra el Guid correcto. La URL también está pasando el Guid correcto para su recuperación.

Parece que no puedo capturar el punto en el que esto falla, pero ¿cómo haría para pasar un System.Guid como parámetro al Controller?

Respuesta

17

A menos que hayas actualizado tus rutas, está esperando (por defecto) que el parámetro final de una ruta se denomine "id". Es decir, si tiene una ruta como/specific/edit/5646-0767 -..., mapeará el guid en el diccionario de valores de ruta con la clave "id" independientemente de la denominación del parámetro en su método. Me siguen esta convención y cambiar la definición del método a:

public ActionResult Edit(Guid id) 

Usted puede evitar esto, especificando explícitamente el nombre del parámetro de ruta, pero luego terminar con una URL que se parece a:/específica/editar? itemid = 5646-0767 -...

+0

Ahora me siento estúpido por preguntar :( – BinaryMisfit

+0

No te preocupes, la única razón por la que sabía que la respuesta es que hice lo mismo una vez y tuve que resolverlo. – tvanfosson

4

Poner código de ejemplo siguiente para cualquier persona que lo necesite (Claro que sí)

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

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

    } 

Gracias por la anwer por encima de lo que me llevó a la derecha dirección

Cuestiones relacionadas