Question

Je suis aux prises avec renderaction, le problème c'est qu'il appelle la mauvaise méthode d'action sur mon contrôleur.

Sur mon "Utilisateurs" contrôleur il y a deux méthodes d'action appelé modifier, l'une pour les obtenir, et un pour les requêtes post:

public virtual ActionResult Edit(int id)
{
 //return a view for editing the user
}


[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(UserViewModel model)
{
 //modify the user...
}

De mon point de vue, je suis d'appeler Renderaction comme suit:

Html.RenderAction("Edit", "Users", new { id = 666});

Maintenant, le problème est que je veux l'OBTENIR de la méthode d'action pour le rendu.Cependant (peut-être parce que le modèle contient également une propriété appelée ID?), Renderaction appelle mon POST de la méthode d'action à la place.

Quelle est la bonne façon de le faire?Je suis à l'aide d'ASP.NET MVC 3 RC en cas de questions.

Merci,

Adrian

Était-ce utile?

La solution

Sous l'action utilise la méthode HTTP de son parent action

Le problème, c'est que votre vue est en cours de rendu après action de publication.Tous les sous-action rendus dans la vue d'utiliser la même méthode HTTP.Donc POST est répliqué sur eux.Je ne suis pas sûr de MVC3, mais dans MVC2 il n'y a pas de moyen de surmonter ce problème.

Donc, le problème, c'est que vous voulez que votre Edit() action à rendre un GET sur un POSTE en vue.Hors de la boîte.Aucun moyen.

Vous pouvez bien sûr le faire en fournissant votre propre fonctionnalité = classes.

Autres conseils

Ce n'est pas même de la compilation:

public virtual ActionResult Edit(UserViewModel model) {}

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(UserViewModel model) {}

Vous ne pouvez pas avoir les deux méthodes avec le même nom et les mêmes arguments sur la même classe.Aussi pourquoi vos actions sont virtual?


Mise à JOUR:

Incapable de repro.Cela ne semble pas être le cas:

public class UserViewModel
{
    public int Id { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Edit(int id)
    {
        return View(new UserViewModel());
    }

    [HttpPost]
    public ActionResult Edit(UserViewModel model)
    {
        return View(model);
    }
}

Et dans Index.cshtml le rendu de l'action modifier les appels de la bonne action Edit (l'un avec l'id de paramètre):

@{Html.RenderAction("edit", "home", new { id = "123" });}

Je ne suis pas sûr à 100% si c'est disponible dans MVC3, mais dans MVC2 (avec MvcFutures:Microsoft.Web.MVC) je voudrais utiliser:

Html.RenderAction<UsersController>(c => c.Edit(666));

Je sais que c'est très vieux, et nous sommes sur la MVC5 maintenant - mais c'est encore le comportement lors de l'exécution de Html.RenderAction().

Ma solution à ce cas particulier, était de faire un chèque sur mon [HttpPost] d'action pour les valeurs de mon point de vue, le modèle, et si elles étaient nulles (ou autre), j'ai appelé mon return Edit(), et si ils n'étaient pas, j'ai appelé AntiForgery.Validate() pour valider correctement le jeton.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top