Frage

Ich bin mit Render zu kämpfen, das Problem ist, dass es die falsche Aktion-Methode auf meinem Controller aufruft.

Auf meinen „Benutzer“ Controller gibt es zwei Aktionsmethoden genannt bearbeiten, ein für get und ein für Post-Anfragen:

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...
}

Aus meiner Sicht, ich rufe Render es wie folgt:

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

Das Problem ist jetzt, dass ich die GET-Aktion-Methode gerendert werden soll. Aber (vielleicht, weil das Modell eine Eigenschaft enthält genannt ID?), Render ruft meine POST Aktion-Methode statt.

Was ist der richtige Weg, dies zu tun? Ich bin mit ASP.NET MVC 3 RC, falls es darauf ankommt.

Danke,

Adrian

War es hilfreich?

Lösung

Sub-Aktion verwendet HTTP-Methode der übergeordneten Aktion

Das Problem ist, dass Ihre Ansicht nach einer Postback Aktion gerendert wird. Alle Unteraktion Renderings in der Ansicht verwendet die gleiche HTTP-Methode. So POST wird auf sie repliziert. Ich bin nicht sicher über MVC3, aber in MVC2 gibt es keine integrierte Möglichkeit, dieses Problem zu überwinden.

Das Problem ist also, dass Sie Ihre Edit() Aktion wollen als GET auf POST Ansicht gerendert werden. Out of the box. Auf keinen Fall.

Sie können es natürlich tun, indem Sie Ihre eigene Funktionalität bereitstellt = Klassen.

Andere Tipps

Das wird nicht einmal kompilieren:

public virtual ActionResult Edit(UserViewModel model) {}

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

Sie können nicht zwei Methoden mit dem gleichen Namen und den gleichen Argumente auf der gleichen Klasse. Auch warum Ihre Aktionen sind virtual?


UPDATE:

Kann nicht repro. Dies scheint nicht der Fall zu sein:

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);
    }
}

Und in Index.cshtml macht die Bearbeitungsaktion ruft die richtige Aktion Bearbeiten (die mit id-Parametern):

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

Ich bin sicher nicht 100%, wenn dies in MVC3 verfügbar ist, aber in MVC2 (mit MvcFutures: Microsoft.Web.MVC) Ich würde verwenden:

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

Ich weiß, das ist sehr alt, und wir sind auf MVC5 jetzt -. Aber das ist immer noch das Verhalten zeigen, wenn Html.RenderAction() läuft

Meine Lösung zu diesem speziellen Fall war eine Überprüfung in meiner [HttpPost] Aktion für Werte auf meiner Ansicht Modell zu machen, und wenn sie null sind (oder was auch immer) ich meinen return Edit() genannt, und wenn sie es nicht waren, rief ich AntiForgery.Validate() zu richtig das Token validieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top