asp.net mvc de routage: comment faire pour utiliser la valeur par défaut de l'action mais non paramètre par défaut?
Je suis la réécriture de la question, que les réponses me montrer que je n'ai pas défini assez bon. Je vais laisser la question d'origine de référence ci-dessous.
Lorsque vous configurez votre routage, vous pouvez spécifier les valeurs par défaut pour les différentes url/route de pièces. Prenons l'exemple que VS assistant 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 le contrôleur n'est pas spécifié, DefaultPageController sera utilisé et si l'action n'est pas spécifié "Index" action sera utilisé.
Les url ont généralement l'apparence: http://mysite/MyController/MyAction
.
Si il n'y a pas d'action dans l'Url comme ceci: http://mysite/MyController
puis l'action index sera utilisé.
Supposons maintenant j'ai deux actions dans mon controller Index et AnotherAction. Les url qui leur correspondent sont http://mysite/MyController
et http://mysite/MyController/AnotherAction
respectivement. Mon "Index" action accepte un paramètre, id. Donc, Si j'ai besoin de passer un paramètre à mon action Index, je peux le faire: http://mysite/MyController/Index/123
. Notez que, contrairement à l'URL http://mysite/MyController
, je dois spécifier l'Index de l'action de manière explicite. Ce que je veux faire est d'être en mesure de passer http://mysite/MyController/123
au lieu de http://mysite/MyController/Index/123
. Je n'ai pas besoin de "Index" dans cette URL, je veux le mvc moteur de reconnaître, que, lorsque je demande http://mysite/MyController/123
, 123 n'est pas une action (parce que je n'ai pas défini d'une action avec ce nom), mais un paramètre par défaut de mon action "Index". Comment puis-je configurer le routage pour y parvenir?
Ci-dessous est le texte original de la question.
J'ai un contrôleur avec deux méthodes définis comme cette
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(SomeFormData data)
{
return View();
}
Cela me permet de traiter les Url de http://website/Page
à la fois lorsque l'utilisateur accède à cette url (GET) et quand ils ont par la suite publier le formulaire (POST).
Maintenant, quand j'processus de la publier, dans certains cas, je veux rediriger le navigateur à cette adresse:
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 puis-je configurer le routage, de sorte que cela fonctionne? Actuellement, j'ai "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 un autre contrôleur de méthode comme ceci:
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 contrôleur de type 'PageController'
est ambigu entre la suivante
les méthodes d'action:
Système.Web.Mvc.ActionResult Index() sur
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. Cette aurait fonctionné si je n'ai pas.
Vous devez vous connecter pour publier un commentaire.
Ici est de savoir comment cela peut être résolu:
Vous pouvez créer un itinéraire contrainte, pour indiquer au moteur de routage, que si vous avez quelque chose dans l'url qui ressemble à un numéro (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 certain nombre (AnotherAction) ensuite c'est une action.
Considérer Ce code:
Cette définition de la route ne correspondent à des valeurs numériques après MyController dans
http://mysite/MyController/123
de sorte qu'il ne sera pas interférer avec l'appel d'une autre action sur le même contrôleur.Source: Création d'un Itinéraire de Contrainte
Si vous garder le nom de la variable de rester étant ID, vous n'avez pas besoin de changer quoi que ce soit.
Renommer le post de "PostIndex" et d'ajouter cet attribut:
Même question sur DONC ici.
Ok, voici un copier/coller d'une réponse pour vous, si cela aide.
Oh je l'ai maintenant. Je pense qu'Il n'est pas possible avec itinéraire par défaut, Vous avez besoin de la carte des itinéraires personnalisés.
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 recevoir du courrier, et une autre est d'y accéder par obtenir, et une autre est d'y accéder par obtenir et le paramètre...
Que vous devez faire 3 actionresult avec des noms différents, et de revenir de même vue que la Vue("ThisIsTheResult")