Tengo un controlador con un método de acción de la siguiente manera:
public class InventoryController : Controller
{
public ActionResult ViewStockNext(int firstItem)
{
// Do some stuff
}
}
Y cuando lo ejecuto, aparece un error que indica:
El diccionario de parámetros no contiene un valor válido de tipo 'System.Int32' para el parámetro 'firstItem'. Para hacer que un parámetro sea opcional, su tipo debe ser un tipo de referencia o un tipo que acepta valores NULL.
Lo tuve funcionando en un momento y decidí probar la función sin parámetros. Al descubrir que el controlador no era persistente, volví a colocar el parámetro, ahora se niega a reconocer el parámetro cuando llamo al método.
Estoy usando esta sintaxis de URL para llamar a la acción:
http://localhost:2316/Inventory/ViewStockNext/11
¿Alguna idea de por qué obtendría este error y qué debo hacer para solucionarlo?
Intenté agregar otro método que toma un número entero a la clase y también falla por la misma razón. Intenté agregar uno que toma una cadena, y la cadena está configurada como nula. Intenté agregar uno sin parámetros y funciona bien, pero por supuesto no se adapta a mis necesidades.
fuente
new { firstItem = @"\d" }
. De esta forma solo aceptará si el parámetro es cualquier tipo de número. Puede modificar la expresión regular a su gusto, e incluso limitar el número de decimales, así:new { firstItem = @"\d{4}" }
- ahora solo puede tener 4 números. Editar: ejemplo de MapRoute completamente modificado: jsfiddle.net/HJRgTpuedes cambiar firstItem a id y funcionará
puede cambiar el enrutamiento en global.asax (no lo recomiendo)
y no puedo creer que nadie haya mencionado esto, puedes llamar a:
En una @ Url.Action sería:
dependiendo del tipo de lo que estés haciendo, la última será más adecuada. También debería considerar no realizar la acción ViewStockNext y en su lugar una acción ViewStock con index. (mis 2 centavos)
fuente
Para reformular la respuesta de Jarret Meyer , debe cambiar el nombre del parámetro a 'id' o agregar una ruta como esta:
El motivo es que la ruta predeterminada solo busca acciones sin parámetro o con un parámetro llamado 'id'.
Editar: Je, no importa, Jarret agregó un ejemplo de ruta después de la publicación.
fuente
o hazlo con el atributo de ruta:
fuente
routes.MapMvcAttributeRoutes();
dentro delRegisterRoutes(RouteCollection)
método de la aplicación (generalmente con scaffolding en App_Start \ RouteConfig.cs). Puede que no esté allí de forma predeterminada.Headspring creó una bonita biblioteca que le permite agregar alias a sus parámetros en los atributos de la acción. Esto se ve así:
Con esto, no tiene que modificar su enrutamiento solo para manejar un nombre de parámetro diferente. La biblioteca también admite su aplicación varias veces para que pueda mapear varias ortografías de parámetros (útil cuando se refactoriza sin romper su interfaz pública).
Puede obtenerlo de Nuget y leer el artículo de Jeffrey Palermo aquí.
fuente
public ActionResult ViewNextItem(int? id)
hace que elid
entero sea un tipo anulable, sin necesidad de conversiones de cadena <-> int.fuente
Con la función Asistente de etiquetas de ASP.NET Core:
fuente
Hay otra forma de lograrlo (descrita con más detalles en el ejemplo de Pager de Stephen Walther
Básicamente, crea un enlace en la vista:
En routeData puede especificar pares de nombre / valor (por ejemplo, routeData ["página"] = 5), y en la función de índice del controlador, los parámetros correspondientes reciben el valor. Es decir,
tendrá la página pasada como 5. Tengo que admitir que es bastante inusual que la cadena ("página") se convierta automáticamente en una variable, pero así es como MVC funciona en otros idiomas también ...
fuente
La razón del tratamiento especial de "id" es que se agrega al mapeo de ruta predeterminado. Para cambiar esto, vaya a Global.asax.cs y encontrará la siguiente línea:
Cámbielo a:
fuente
O puede intentar cambiar el tipo de parámetro a cadena y luego convertir la cadena a un número entero en el método. Soy nuevo en MVC, pero creo que necesita objetos que aceptan valores NULL en su lista de parámetros, ¿de qué otra manera indicará el controlador que no se proporcionó dicho parámetro? Entonces...
fuente