asp.net routage mvc: comment utiliser l'action par défaut mais le paramètre non par défaut?
je réécris la question, car les réponses jusqu'à présent me montrent que je ne l'ai pas assez bien définie. Je vais laisser la question originale pour référence ci-dessous.
lorsque vous configurez votre routage, vous pouvez spécifier des valeurs par défaut pour différentes parties d'url/route. Considérons l'exemple que VS wizard génère:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
dans cet exemple si controller n'est pas spécifié, DefaultPageController sera utilisé et si l'action n'est pas spécifiée, l'action "Index" sera utilisée.
URL généralement ressembler à ça: http://mysite/MyController/MyAction
.
S'il N'y a pas D'action dans une Url comme celle-ci: http://mysite/MyController
alors l'action index sera utilisée.
supposons maintenant que j'ai deux actions dans mon index de controller et une autre action. Les url qui leur correspondent sont http://mysite/MyController
et http://mysite/MyController/AnotherAction
respectivement. Mon action "Index" accepte un paramètre, id. Donc si je dois passer un paramètre à mon action D'Index, je peux le faire:http://mysite/MyController/Index/123
. Notez que contrairement à URLhttp://mysite/MyController
, je dois spécifier l'Index l'action de manière explicite. Ce que je veux faire, c'est pouvoir passer!--11--> au lieu de http://mysite/MyController/Index/123
. Je n'ai pas besoin de "Index" dans cette URL Je veux que le moteur mvc reconnaisse, que quand je demande http://mysite/MyController/123
, que 123 n'est pas une action (parce que je n'ai pas défini d'action avec ce nom), mais un paramètre de mon action par défaut "Index". Comment configurer le routage pour réaliser ceci?
ci-dessous se trouve la formulation originale de la question.
j'ai un contrôleur avec deux méthodes défini comme ceci
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(SomeFormData data)
{
return View();
}
cela me permet de traiter L'Url comme http://website/Page
à la fois quand l'utilisateur navigue vers cette url (GET) et quand il postera par la suite le formulaire (POST).
Maintenant, quand j'processus de la publier, dans certains cas, je veux rediriger le navigateur à l'url suivante:
http://website/Page/123
Où 123 est certain entier, et j'ai besoin d'une méthode pour traiter cette url dans mon contrôleur.
comment configurer le routage, donc ça marche? Actuellement, Je avoir "par défaut" de routage généré par l'assistant comme ceci:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
j'ai essayé d'ajouter une autre méthode de controller comme celle-ci:
public ActionResult Index(int id)
{
return View();
}
Mais cela ne fonctionne pas comme ambiguë action exception est levée:
La demande actuelle de l'action "Index" sur le type de contrôleur 'PageController' est ambigu entre les suivants les méthodes d'action: Système.Web.Mvc.ActionResult Index() on type PageController Système.Web.Mvc.ActionResult Index(Int32), sur le type de PageController
je dois ajouter que j'ai aussi d'autres actions dans ce contrôleur. aurait fonctionné si Je ne l'avais pas fait.
4 réponses
Voici comment cela peut être résolu:
vous pouvez créer une contrainte de route, pour indiquer au moteur de routage, que si vous avez quelque chose dans l'url qui ressemble à un nombre (123) alors c'est un paramètre d'action pour l'action par défaut et si vous avez quelque chose qui ne ressemble pas à un nombre (AnotherAction) alors c'est une action.
réfléchir à Ce code:
routes.MapRoute(
"MyController", "MyController/{productId}",
new {controller="My", action="Index"},
new {productId = @"\d+" });
cette définition de route ne correspond qu'aux valeurs numériques après MyController dans http://mysite/MyController/123
donc cela n'empêchera pas d'appeler une autre action sur le même contrôleur.
si vous conservez la variable name pour rester ID, vous n'avez pas besoin de changer quoi que ce soit.
renommer le post one en "PostIndex" et ajouter cet attribut:
[ActionName("Index")]
même question sur SO ici.
Ok, voici une réponse Couper/Coller pour vous, si cela aide.
public ActionResult Index() {
return View();
}
[AcceptVerbs(HttpVerbs.Post), ActionName("Index")]
public ActionResult PostIndex(SomeFormData data) {
return View();
}
Oh je l'ai maintenant. Je pense que ce n'est pas possible avec la route par défaut, vous devez cartographier les routes personnalisées.
// /MyController/AnotherAction
routes.MapRoute(
null,
"MyController/AnotherAction",
new { controller = "DefaultPage", action = "AnotherAction" }
);
// /MyController
// /MyController/id
routes.MapRoute(
null,
"MyController/{id}",
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional }
);
ps. Les routes par défaut comme /MyController/id doit mappé à la dernière.
je pense que vous voulez retourner le même point de vue, mais vous devez comprendre que vous faites deux différentes choses. L'un est receive post, un autre est accessing by get, et un autre est accessing by get and parameter...
Vous devez faire 3 actionresult avec des noms différents, et de revenir de même vue que la Vue("ThisIsTheResult")