2012-01-22 11 views
21

Używam maszynki do golenia MVC3 i próbuję przekazać obiekt do częściowego widoku, a to nie działa.Jak wysłać obiekt modelu w Html.RenderAction (MVC3)

Działa to dobrze bez wysyłania model obiektowy w celu częściowego widzenia:

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

Próba ta nie wysłał modelu obiektowego, otrzymuję null zamiast (obiekt ma danych, a widok spodziewa it): '

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

Czy jest to możliwe przy użyciu funkcji RenderAction?

Dzięki!

Edytuj: Znalazłem błąd, wystąpił błąd związany z działaniem kontrolera, który nie podniósł wysyłanego obiektu. Dzięki za pomoc!

+1

Czy możesz podać podpis czynności, do której dzwonisz? – ivowiblo

+0

dlaczego przekazujesz nazwę widoku jako parametr? powinieneś przekazać akcję i kontroler zamiast: – ivowiblo

+0

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

Odpowiedz

23

że chcesz przekazać foo jako modelu, sprawiają, że pierwszy

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

teraz Złóż ActionResult

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

nazwać to

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

Dzięki za odpowiedź. Miałem błąd, którego przeoczyłem w podpisie akcji kontrolera. Naprawiono to i teraz dostaje obiekt. – Michael

+0

Czy to oznacza status ModelState? – aelstonjones

6

Zazwyczaj, jeśli mam już model dostępne jest bardziej sensowne używanie Html.Partial niż próba wyrenderowania ac tację.

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

Gdzie Foo.cshtml jest plik widzenia (być może w udostępnionym folderze) silnie wpisane zz @model FooProject.Models.FooModel lub cokolwiek model nazywa. Może to być tak złożony model, jak tego potrzebujesz. Model to główny model strony, na który należy ustawić FooModel - lub po prostu pominąć ten parametr, jeśli widok Foo używa tego samego modelu, co strona nadrzędna.

RenderAction Generalnie lepiej jest, gdy masz tylko proste parametry, ponieważ po prostu symulujesz żądanie do zwykłego działania, które ma parametry parametrów routingu/zapytania - a następnie zrzucasz tę odpowiedź na swoją stronę. Działa dobrze, jeśli musisz umieścić coś w układzie, który nie jest dostępny w modelu strony, na przykład na pasku bocznym.

29

Można faktycznie przekazać obiekt do metody kontrolera za pomocą czynności. Można to zrobić na dowolnym dostępnym widoku, na przykład mam go w bibliotece współdzielonej, która zostanie zbudowana do projektowania folderów bin, które odwołują się do mojego wspólnego projektu (właściwości - Kopiuj, jeśli nowsze w pliku widoku, w Visual Studio). Odbywa się to tak:

Kontroler:

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

strona MVC (przy użyciu składni Razor):

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

Uwaga: W @ Html.Action, modelu obiektowego musi być typu MyModel, a ten trzeci parametr musi być ustawiony na nazwę zmiennej kontrolera, której kopią jest MyModel m. Do tego musisz przypisać m, więc robię m = Model.

+7

To powinna być zaakceptowana odpowiedź. Dziękuję za dodanie go rok później. –

+0

@ Valamas-AUS Dzięki :) – theJerm

Powiązane problemy