Eu tenho um controlador com um método de ação da seguinte maneira:
public class InventoryController : Controller
{
public ActionResult ViewStockNext(int firstItem)
{
// Do some stuff
}
}
E quando eu o executo, recebo um erro informando:
O dicionário de parâmetros não contém um valor válido do tipo 'System.Int32' para o parâmetro 'firstItem'. Para tornar um parâmetro opcional, seu tipo deve ser um tipo de referência ou um tipo que pode ser anulado.
Eu tinha funcionado em um ponto e decidi tentar a função sem parâmetros. Descobrindo que o controlador não era persistente, coloquei o parâmetro de volta, agora ele se recusa a reconhecer o parâmetro quando chamo o método.
Estou usando esta sintaxe de url para chamar a ação:
http://localhost:2316/Inventory/ViewStockNext/11
Alguma ideia de por que eu receberia esse erro e o que preciso fazer para corrigi-lo?
Tentei adicionar outro método que leva um inteiro para a classe, mas também falha pelo mesmo motivo. Eu tentei adicionar um que leva uma string, e a string está definida como nula. Tentei adicionar um sem parâmetros e funciona bem, mas é claro que não atenderá às minhas necessidades.
fonte
new { firstItem = @"\d" }
. Desta forma, só aceitará se o parâmetro for qualquer tipo de número. Você pode modificar a regex como quiser e até mesmo limitar o número de decimais, como este:new { firstItem = @"\d{4}" }
- agora ela pode ter apenas 4 números. Editar: exemplo de MapRoute totalmente modificado: jsfiddle.net/HJRgTvocê pode alterar firstItem para id e funcionará
você pode alterar o roteamento em global.asax (eu não recomendo isso)
e, não acredito que ninguém mencionou isso, você pode ligar para:
Em um @ Url.Action seria:
dependendo do tipo de coisa que você está fazendo, a última será mais adequada. Além disso, você deve considerar não fazer a ação ViewStockNext e, em vez disso, uma ação ViewStock com índice. (meus 2 centavos)
fonte
Para reformular a resposta de Jarret Meyer , você precisa alterar o nome do parâmetro para 'id' ou adicionar uma rota como esta:
O motivo é que a rota padrão procura apenas ações sem nenhum parâmetro ou um parâmetro chamado 'id'.
Edit: Heh, não importa Jarret adicionou um exemplo de rota após a postagem.
fonte
ou faça isso com Atributo de rota:
fonte
routes.MapMvcAttributeRoutes();
dentro doRegisterRoutes(RouteCollection)
método do aplicativo (geralmente com scaffold em App_Start \ RouteConfig.cs). Pode não estar lá por padrão.Headspring criou uma boa biblioteca que permite adicionar apelidos aos seus parâmetros em atributos na ação. É assim:
Com isso, você não precisa alterar seu roteamento apenas para lidar com um nome de parâmetro diferente. A biblioteca também suporta a aplicação várias vezes para que você possa mapear várias grafias de parâmetros (útil ao refatorar sem quebrar sua interface pública).
Você pode obtê-lo com Nuget e ler o artigo de Jeffrey Palermo sobre ele aqui
fonte
public ActionResult ViewNextItem(int? id)
torna oid
inteiro um tipo anulável, sem necessidade de conversões de string <-> int.fonte
Usando o recurso ASP.NET Core Tag Helper:
fonte
Há outra maneira de fazer isso (descrito em mais detalhes no exemplo do Pager de Stephen Walther
Basicamente, você cria um link na visualização:
Em routeData, você pode especificar pares de nome / valor (por exemplo, routeData ["página"] = 5) e, na função de índice do controlador, os parâmetros correspondentes recebem o valor. Isso é,
terá a página passada como 5. Tenho que admitir, é bastante incomum que string ("página") se torne automagicamente uma variável - mas é assim que MVC funciona em outras linguagens também ...
fonte
A razão para o tratamento especial de "id" é que ele é adicionado ao mapeamento de rota padrão. Para alterar isso, vá para Global.asax.cs e você encontrará a seguinte linha:
Altere para:
fonte
Ou, você pode tentar alterar o tipo de parâmetro para string e, em seguida, converter a string em um inteiro no método. Eu sou novo no MVC, mas acredito que você precisa de objetos anuláveis em sua lista de parâmetros. De que outra forma o controlador indicará que esse parâmetro não foi fornecido? Assim...
fonte