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.

17
demandé sur Community 2011-04-08 10:59:16

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.

Source: Création d'un Itinéraire de Contrainte

10
répondu Andrew Savinykh 2018-04-04 01:10:45

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();    
}
3
répondu NKCSS 2017-05-23 12:32:01

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.

1
répondu cem 2011-04-08 09:03:05

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")

0
répondu Alberto León 2011-04-08 08:28:36