2012-01-22 7 views
21

Uso il rasoio MVC3 e sto cercando di passare un oggetto a una vista parziale e non funziona.Come inviare oggetto modello in Html.RenderAction (MVC3)

Questo funziona bene senza inviare il modello a oggetti per la vista parziale:

Html.RenderAction("Index", "ViewName"); 

Cercando questo non ha inviato il modello a oggetti, sto ottenendo valori nulli invece (l'oggetto ha dei dati, e la vista si aspetta it): '

Html.RenderAction("Index", "ViewName", objectModel); 

È possibile utilizzare RenderAction?

Grazie!

Modifica: ho trovato l'errore, si è verificato un errore con l'azione del controller che non ha rilevato l'oggetto inviato. Grazie per tutto il vostro aiuto!

+1

potresti fornire la firma dell'azione che stai chiamando? – ivowiblo

+0

perché stai passando il viewname come parametro? dovresti passare l'azione e il controller invece – ivowiblo

+0

@ Html.RenderAction ("Index", "ViewName", new {objectParam1 = objectModel1, objectParam1 = objectModel2}) –

risposta

23

che tu voglia passare foo come modello, lo rendono prima

public class Foo { 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

ora fare un ActionResult

public ActionResult FooBar(Foo _foo){ 
    return PartialView(_foo); 
} 

chiamano

@Html.RenderAction("FooBar", "Controller", new { Name = "John", Age=20 }); 
+0

Grazie per la risposta. Ho avuto un errore che ho trascurato nella firma di Action del controller. Riparato e ora sta ottenendo l'oggetto. – Michael

+0

Passa a ModelState? – aelstonjones

6

Di solito se ho già un modello disponibile ha più senso usare Html.Partial che provare a rendere un ac zione.

@Html.Partial("Foo", Model.FooModel) 

Dove Foo.cshtml è un file di vista (forse nella cartella condivisa) fortemente tipizzato con con @model FooProject.Models.FooModel o qualunque sia il vostro modello si chiama. Questo può essere un modello complesso quanto è necessario che sia. Modello è il modello principale della pagina in cui è necessario impostare FooModel oppure omettere questo parametro se la vista utilizza lo stesso modello della pagina padre.

RenderAction è generalmente meglio quando si dispone di parametri semplici, perché si sta semplicemente simulando una richiesta per un'azione normale che ha parametri di routing/query string e quindi si riversa tale risposta nella pagina. Funziona bene se devi mettere qualcosa in un layout che non è disponibile nel modello della tua pagina come un elemento in una barra laterale.

29

In realtà è possibile passare un oggetto a un metodo di controllo utilizzando Azione. Questo può essere fatto su qualsiasi vista disponibile, ad esempio ne ho uno in una libreria condivisa che viene creata per cartelle bin di progetto che fanno riferimento al mio progetto condiviso (proprietà - Copia se più recente nel file di visualizzazione, in Visual Studio). E 'fatto in questo modo:

Controller:

public class GroovyController : Controller 
{ 
    public ActionResult MyTestView(MyModel m) 
    { 
     var viewPath = @"~\bin\CommonViews\MyTestView"; 
     return View(viewPath, m); 
    } 
} 

pagina MVC (utilizzando la sintassi Razor):

@Html.Action("MyTestView", "Groovy", new { m = Model }) 

Nota: nel @ Html.Action, l'oggetto del modello deve essere di tipo MyModel e quel 3 ° parametro deve essere impostato sul nome della variabile del controller, di cui il mio è MyModel m. Il m è ciò che devi assegnare, quindi faccio m = Model.

+7

Questa dovrebbe essere la risposta accettata. Grazie per averlo aggiunto un anno dopo. –

+0

@ Valamas-AUS Grazie :) – theJerm

Problemi correlati