web-dev-qa-db-fra.com

Passer le paramètre à la vue partielle dans ASP.NET Core

Sur une application ASP.NET Core 2.0, je dois rendre une vue partielle et passer quelques paramètres:

@Html.Partial("Form", new { File = "file.pdf" })

Sur la vue partielle, j'ai essayé d'y accéder en utilisant:

@Model.File

Et je reçois l'erreur:

RuntimeBinderException: 'object' does not contain a definition for 'File'

Si j'utilise simplement sur mon partiel:

@Model

J'obtiens ce qui suit imprimé sur la page:

{ File = file.pdf } 

Donc là le modèle est passé et il y a un fichier de propriétés dedans.

Alors qu'est-ce qui me manque?

9
Miguel Moura

Vous passez des données non typées (type anonyme) à la vue partielle. Vous ne pouvez pas utiliser @Model.File. Au lieu de cela, vous devrez utiliser la méthode Eval de ViewData pour récupérer la valeur.

@ViewData.Eval("File")

L'approche traditionnelle consiste à créer une classe ViewModel fortement typée et à la passer à la vue partielle. Ensuite, vous pouvez y accéder en tant que @Model.File.

public class SampleViewModel
{
    public string File { get; set; }
}

@Html.Partial("Form", new SampleViewModel { File = "file.pdf" })

Vue partielle intérieure,

@model SampleViewModel

<h1>@Model.File</h1>
16
Win

Vous devriez avoir dynamic comme modèle de votre vue partielle, de cette façon, vous pouvez tout passer - comme votre objet anonyme - et cela fonctionnera simplement. Ajouter:

@model dynamic

Vers le fichier Form.cshtml.

4
Ricardo Peres

Lorsque vous faites new { File = "file.pdf" }, vous passez un objet qui contient un fichier d'attributs. Comme il s'agit du type object, vous ne pouvez accéder directement à aucune de ses variables en c #. Il y a quelques codes moches pour accéder à des champs à partir d'un objet tel que celui qui peut être trouvé ici: C # .NET CORE comment obtenir la valeur d'un attribut personnalisé?

Cependant, dans ce cas, la façon la plus recommandée (pour des raisons de sécurité) est de créer une classe et de passer un objet de cette classe.

Donc, si vous créez la classe suivante:

public class MyFileInfo{
    public string File { get; set }
}

Ensuite, vous pouvez créer votre objet en passant:

@Html.Partial("Form", new MyFileInfo{ File = "file.pdf" })

Dans votre vue partielle, au début, définissez votre classe de modèle

@model MyFileInfo

Ensuite, dans le même fichier, vous pourrez maintenant accéder

@Model.File
1
Neville Nazerane