2010-03-23 49 views
37

Estoy tratando de implementar una página de edición para que el administrador modifique los datos en la base de datos. Desafortunadamente, me encuentro con un error."El diccionario de parámetros contiene una entrada nula para el parámetro" - ¿Cómo solucionarlo?

El código de abajo:

public ViewResult Edit(int productId) { 
     // Do something here 
} 

pero estoy consiguiendo este error:

"The parameters dictionary contains a null entry for parameter 'productId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ViewResult Edit(Int32)' in 'WebUI.Controllers.AdminController'. To make a parameter optional its type should be either a reference type or a Nullable type. 
Parameter name: parameters" 

he cambiado de ruta en Global.asax.cs así:

routes.MapRoute(
"Admin", 
"Admin/{action}/{ productId}", 
new { controller = "Admin", action = "Edit", productId= "" } 
); 

pero todavía estoy recibiendo el error .

Respuesta

44

Esa cadena vacía para productId (en su ruta por defecto) conseguirá analizada a una entrada nula por el marco, y desde int no permite null ... que está recibiendo el error.

Cambio:

public ViewResult Edit(int productId) 

a

public ViewResult Edit(int? productId) 

si desea permitir que la persona que llama no tiene que pasar en una identificación del producto, que es lo que parece que lo que quiere hacer basado en la forma en que se configura su ruta

También podría volver a configurar la ruta por defecto para pasar de alguna manera predeterminada conocida por si no se envía productId:

routes.MapRoute( 
    "Admin", 
    "Admin/{action}/{ productId}", 
    new { controller = "Admin", action = "Edit", productId= -1 } 
0

la norma "int" clase (int32) no acepta valores nulos, y fallará un lanzamiento de una cadena vacía a int en ese caso e intentará asignarle nulo.

Probablemente eche un vistazo a lo que estás tratando de lograr: si estás tratando de obligar al administrador a tener un ID de producto para que edite ese registro en la base de datos, pensaría en poner eso en el objeto Request u otro método que le dará más versatilidad.

4

productId debe estar restringido al tipo int.

new {controller="Admin", action="Edit"}, 
new {productId = @"\d+" } 
1

Quizás se olvidó de pasar los datos requeridos (en este caso, 'productId') en la Vista.
Asumo que intenta acceder a los detalles haciendo clic en el enlace en la página de índice que también asumí como "Ver \ Admin \ index.cshtml"

<td> 
     @Html.ActionLink("Edit", "Edit", new { productId = item.ProductId }) | 
     @Html.ActionLink("Details", "Details", new { productId = item.ProductId }) | //note the productId is filled by item.ProductId 
     @Html.ActionLink("Delete", "Delete", new { productId = item.ProductId }) 
    </td> 

no lo hacen todo resultará ser params nulo, por lo tanto, causa el error.

6

Aquí es la manera cómo ignorar estos errores argumento a favor de cualquier método de control de invocación:

public class MyControllerBase 
{ 
    //... 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Exception != null) 
     { 
      var targetSite = filterContext.Exception.TargetSite; 
      if (targetSite.DeclaringType != null) 
       if (targetSite.DeclaringType.FullName == typeof(ActionDescriptor).FullName) 
        if (targetSite.Name == "ExtractParameterFromDictionary") // Note: may be changed in future MVC versions 
        { 
         filterContext.ExceptionHandled = true; 
         filterContext.Result = new HttpStatusCodeResult((int)HttpStatusCode.BadRequest); 
         return; 
        } 
      //... 
     } 
     // ... 
    } 
} 
15

me encontré con el mismo problema siguiendo el ejemplo SportStore trabajado en Pro ASP.Net

La solución fue en realidad, mi vista de índice tiene el siguiente código.

@Html.ActionLink("Edit", "Edit", new { id=item.ProductID }) | 

Sin embargo, mi método Edit en mi controlador se definió como

public ViewResult Edit(int productId) 

cambiar mi punto de vista Índice de leer

@Html.ActionLink("Edit", "Edit", new { productId=item.ProductID }) | 

solucionó el problema

0

Cambio en la ruta podía implicar otras rutas que usan la misma url. Para mantenerlo simple y cubrir todas las bases.

[HttpGet] 
public ActionResult ThePage(int id = -1) 
{ 
    if(id == -1) 
    { 
     return RedirectToAction("Index"); 
    } 

    //Or proceed as normal 
} 

Esto también es grande si se trata de un error que está recibiendo cuando se accede a la página, ya que están obligados a tener un id, (por ejemplo ... personas poniendo la url en la barra de direcciones cuando están se supone que no) luego establece el parámetro a un valor opcional.

EDITAR: lo siento int, no tan largo como la pregunta

Cuestiones relacionadas