rotas MVC para compartilhar a mesma ação?
-
06-07-2019 - |
Pergunta
Eu tenho as seguintes duas rotas definidas no meu aplicativo MVC;. - No momento eu tenho dois "MVC Visualização de páginas de conteúdo" definidos
/ShowName/NameById
/ShowName/Index
No entanto, o conteúdo dessas duas páginas são idênticos? É possível que duas rotas para compartilhar a mesma página de conteúdo? Se não, então eu a) pode criar uma regra única para ambas as rotas ou b) que eu deveria criar um usercontrol para compartilhar entre ambas as páginas de conteúdo para mostrar meus dados?
routes.MapRoute(
"NameById",
"Name/{theName}/{nameId}",
new
{
action = "NameById",
controller = "ShowName",
theName = "Charley"
}
,new { nameId = @"\d+" }
);
routes.MapRoute(
"ShowName",
"Name/{theName}",
new
{
action = "Index",
controller = "ShowName",
theName = "Charley"
}
);
Editar Eu li as respostas abaixo e eu tenho os seguintes métodos de resultado de ação. Se eu remover um dos métodos (por exemplo, o índice), então como eu poderia reescrever meus rotas a uma única rota?
public ActionResult Index(string theName)
public ActionResult NameById(string theName, int? nameId)
Assim, a seguir funciona o trabalho de url?
/Name/Charley
/Name/Charley/11234
Solução
Você realmente precisa de 2 rotas diferentes? Você poderia tornar o padrão para a sua rota Índice
Name/{theName}/{nameId}
E FAÇA NameID a entrada anulável a sua ação. Em seguida, basta adicionar alguma lógica para sua ação que verifica se NameID tem um valor e age em conformidade.
Outras dicas
Você pode criar uma vista parcial para a área de detalhes da página, mantendo a separação das duas acções em caso de mudança em um momento posterior. Ou você poderia apenas
return View("DetailView", model);
Mas isso pode introduzir uma corda extra para gerenciar entre as duas ações do controlador. Desde MVC não suporta a sobrecarga pelo nome da ação (a menos que você tem um par GET / POST, um sem argumentos), você pode simplesmente verificar o parâmetro {NameID} e veja se ele está vazio / null antes de usá-lo.