web-dev-qa-db-fra.com

Comment envoyer un objet modèle dans Html.RenderAction (MVC3)

J'utilise le rasoir MVC3, et j'essaie de passer un objet à une vue partielle, et cela ne fonctionne pas.

Cela fonctionne très bien sans envoyer le modèle d'objet à la vue partielle:

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

Essayer cela n'envoie pas l'objet modèle, j'obtiens des valeurs nulles à la place (l'objet a des données et la vue les attend): '

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

Est-ce même possible en utilisant RenderAction?

Merci!

Edit: j'ai trouvé l'erreur, il y avait une erreur avec l'action du contrôleur qui n'a pas ramassé l'objet envoyé. Merci pour votre aide!

23
Michael

dites que vous voulez passer foo comme modèle, faites-le d'abord

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

faire maintenant un ActionResult

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

appeler

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

Vous pouvez réellement passer un objet à une méthode de contrôleur en utilisant Action. Cela peut être fait sur n'importe quelle vue disponible, par exemple j'en ai une dans une bibliothèque partagée qui est construite dans des dossiers bin de projet qui référencent mon projet partagé (propriétés - Copier si plus récent sur le fichier de vue, dans Visual Studio). C'est fait comme ça:

Contrôleur:

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

page MVC (utilisant la syntaxe Razor):

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

ou en utilisant la méthode RenderAction:

@{ Html.RenderAction("MyTestAction", "MyTestController", new { area = "area", m = Model }); }

Remarque: dans la @Html.Action(), l'objet Model doit être de type MyModel et ce 3e paramètre doit être défini sur le nom de la variable du contrôleur, dont le mien est MyModel m. Le m est ce que vous devez assigner, donc je fais m = Model.

33
theJerm

Habituellement, si j'ai un modèle déjà disponible, il est plus judicieux d'utiliser Html.Partial que d'essayer de rendre une action.

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

Foo.cshtml est un fichier de vue (peut-être dans votre dossier partagé) fortement tapé avec @model FooProject.Models.FooModel ou quel que soit le nom de votre modèle. Cela peut être un modèle aussi complexe que vous en avez besoin. Le modèle est le modèle principal de votre page dans lequel vous devez définir FooModel - ou simplement omettre ce paramètre si la vue Foo utilise le même modèle que la page parent.

RenderAction est généralement meilleur lorsque vous n'avez que des paramètres simples, parce que vous simulez simplement une demande à une action régulière qui a des paramètres de chaîne de routage/requête - puis videz cette réponse dans votre page. Cela fonctionne bien si vous devez mettre quelque chose dans une mise en page qui n'est pas disponible dans le modèle de votre page, comme un élément dans une barre latérale.

6
Simon_Weaver