Domanda

Sto lottando con RenderAction, il problema è che si chiama il metodo azione sbagliata sul mio controller.

Il mio controller "Utenti" ci sono due metodi di azione chiamati modificare, uno per ottenere e uno per le richieste 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...
}

A mio avviso, sto chiamando RenderAction come segue:

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

Ora il problema è che voglio il metodo di azione GET per essere reso. Tuttavia (forse perché il modello contiene anche una proprietà chiamata ID?), RenderAction chiama invece il mio metodo di azione POST.

Qual è il modo corretto di fare questo? Sto usando ASP.NET MVC 3 RC nel caso in cui essa è importante.

Grazie,

Adrian

È stato utile?

Soluzione

usi azione Sub metodo HTTP della sua azione genitore

Il problema è che il vostro punto di vista è in fase di rendering, dopo un'azione di postback. Tutti rendering sub-azione nella vista utilizzano lo stesso metodo HTTP. Così POST viene replicata su di loro. Io non sono sicuro di MVC3, ma in MVC2 non c'era built-in modo per superare questo problema.

Il problema è che si desidera la vostra azione Edit() per essere reso come un GET su una vista POST. Fuori dalla scatola. In nessun modo.

Si può naturalmente farlo, fornendo le proprie funzionalità = classi.

Altri suggerimenti

Questa non sarà nemmeno la compilazione:

public virtual ActionResult Edit(UserViewModel model) {}

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

Non è possibile avere due metodi con lo stesso nome e gli stessi argomenti sulla stessa classe. Anche perché le vostre azioni sono virtual?


UPDATE:

Impossibile repro. Questo non sembra essere il caso:

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

E nel Index.cshtml rendere l'azione di modifica chiama l'azione Modifica corretto (quello con il parametro id):

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

Io non sono al 100% sicuro se questo è disponibile in MVC3, ma in MVC2 (con MvcFutures: Microsoft.Web.MVC) vorrei utilizzare:

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

So che questo è estremamente vecchio, e siamo sulla MVC5 ora -. Ma questo è ancora il comportamento esibito durante l'esecuzione Html.RenderAction()

La mia soluzione a questo caso particolare, era di fare un check-nella mia azione [HttpPost] per i valori sul mio modello vista, e se fossero null (o qualsiasi altra cosa) ho chiamato il mio return Edit(), e se non erano ho chiamato AntiForgery.Validate() a correttamente validare il token.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top