34 votes

passer des paramètres à ma vue partielle?

J'appelle ma vue partielle comme ceci:

  <% Html.RenderPartial("~/controls/users.ascx"); %>
 

Puis-je passer des paramètres à une vue partielle? Comment vais-je y accéder dans la page users.ascx?

32voto

Darin Dimitrov Points 528142

Vous pouvez passer un objet de modèle au partiel (par exemple une liste de chaînes):

 <% Html.RenderPartial("~/controls/users.ascx", new string[] { "foo", "bar" }); %>
 

Ensuite, vous tapez fortement le partiel et la propriété Model sera du type approprié:

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Collections.Generic.IEnumerable<string>>" %>

<% foreach (var item in Model) { %>
    <div><%= Html.Encode(item) %></div>
<% } %>
 

17voto

jfar Points 19380

Il existe une autre surcharge pour RenderPartial qui transmettra votre modèle.

 <% Html.RenderPartial("~/controls/users.ascx", modelGoesHere); %>
 

Comment y accéder? Comme vous le feriez normalement avec n'importe quelle vue:

 <%= Model.MagicSauce %>
 

6voto

Jules Bartow Points 419

Il a fallu un certain temps pour s'imposer, mais MVC signifie que vous utilisez un Modèle, Vue, Contrôleur d'une manière ou d'une autre pour à peu près tout, y compris des Vues Partielles. La façon dont les trois éléments s'emboîtent peut être un peu intimidant au premier abord. Je n'avais jamais fait jusqu'à maintenant, et il fonctionne, Woohoo!

Espérons que cela aide la personne à côté de vous.... Désolé, je suis en utilisant le rasoir au lieu de .Formes de filet. Je suis aussi de l'extraction de données à partir d'une base de données SQL Server dans le Cadre de l'Entité, dont un développeur est susceptible d'utiliser. J'ai aussi sans doute allé un peu trop loin avec WebGrid, qui est beaucoup plus élégant que d'une instruction foreach. Une base @webgrid.GetHtml() permet d'afficher chaque colonne et de ligne.

Arrière-plan

Dans cet exemple, les utilisateurs ont téléchargé des photos. Leurs images sont affichées dans leur formulaire d'édition à l'aide d'une vue partielle. ImageID et le nom de fichier de métadonnées sont conservées dans SQL Server alors que le fichier est conservé dans le ~/Content/UserPictures répertoire.

Je sais que c'est un peu la moitié de vastes, parce que tous les détails de l'importation et de modification des données personnelles n'est pas montré. Juste le germane pièces de l'utilisation Partielle de la Vue sont concentré sur, avec tout de même quelques bonus EF jeté dans. L'espace de noms est MVCApp3 pour S&G.

Vue Partielle Du Modèle Viewmodel.cs

Le Serveur SQL Images tableau comprend beaucoup plus de colonnes en plus de ImageID et le nom de fichier comme [Caption], [Description], un hachage MD5 pour éviter la même image téléchargé plusieurs fois, et la date de téléchargement. Le ViewModel distille l'Entité vers le bas pour le minimum nécessaire pour un utilisateur de voir leurs photos.

public class Picts
{
    public int ImageID { get; set; }
    public string FileName { get; set; }
}

Vue Principale Vue De Modifier.cshtml

Remarque le cast/convertir fortement du type de la ViewData[].

 @Html.Partial(
      partialViewName: "Picts", 
      model: (IEnumerable<MVCApp3.Models.Picts>)ViewData["Picts"]
 )

Si vous ne définissez pas fortement typées modèle à utiliser pour la Vue Partielle, vous obtiendrez un "Le modèle de l'élément passé dans le dictionnaire est de type 'System.Les données.De l'entité.DynamicProxies..." erreur car il suppose que vous êtes de passage le parent/maître-modèle.

Vue Partielle De La Vue Pictes.cshtml (tout le contenu du fichier est affiché)

@model IEnumerable<MVCApp3.Models.Picts>
@{
    var pictsgrid = new WebGrid(Model);
}
    @pictsgrid.GetHtml(
        tableStyle: "grid",
        displayHeader: false,
        alternatingRowStyle: "alt",
        columns: pictsgrid.Columns( 
            pictsgrid.Column(format:@<text><img src="@Url.Content("~/Content/Users/" + @item.FileName)" alt="@item.ImageID" width="200" />
            @Html.ActionLink(linkText: "Delete", actionName: "DeletePicture", routeValues: new { id = @item.ImageID })
            </text>)
            ))

Contrôleur De IdentityController.cs

Définir le contenu des données dans le ViewData["MyPartialViewModelKeyName"] votre vue partielle va consommer. Vous pouvez donner les clés du dictionnaire n'importe quel nom que vous voulez, mais je lui ai donné ViewData["Pictes"] pour être cohérent avec la vue partielle nom de fichier et son modèle de vue de la définition de classe.

Parce que les images peuvent être partagées entre plusieurs utilisateurs il y a un plusieurs-à-plusieurs table avec un correspondant PITA requête dans le Cadre de l'Entité utilisant des froms et jointures internes pour revenir simplement les images appartenant à, ou partagé avec, un utilisateur:

public class IdentityController : Controller
{
    private EzPL8Entities db = new EzPL8Entities();

    // GET: /Identity/Edit/5
    [Authorize]
    public ActionResult Edit(int? id)
    {

        if (id == null)
            return new HttpNotFoundResult("This doesn't exist");

      // get main form data
      ezpl8_UsersPhysicalIdentity ezIDobj = db.ezpl8_UsersPhysicalIdentity.Find(id)

    // http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/
    // get partial form data for just this user's pictures
                ViewData["Picts"] = (from user in db.ezpl8_Users
                             from ui in user.ezpl8_Images
                             join image in db.ezpl8_Images
                             on ui.ImageID equals image.ImageID
                             where user.ezpl8_UserID == id
                             select new Picts
                             {
                                 FileName = image.FileName,
                                 ImageID = image.ImageID
                             }
                                 ).ToList();

        return View(ezIDobj);
    }

   //  Here's the Partial View Controller --not much to it!
    public ViewResult Picts(int id)
    {
       return View(ViewData["Picts"]);
    }

    [Authorize]  //you have to at least be logged on
    public ActionResult DeletePicture(int id)
    {
        //ToDo:  better security so a user can't delete another user's picture 
        //    TempData["ezpl8_UserID"]
        ezpl8_Images i = db.ezpl8_Images.Find(id);
        if (i != null)
        {
            var path = System.IO.Path.Combine(Server.MapPath("~/Content/Users"), i.FileName);
            System.IO.File.Delete(path: path);

            db.ezpl8_Images.Remove(i);
            db.SaveChanges();
        }
        return Redirect(Request.UrlReferrer.ToString());
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}

0voto

user2689416 Points 1
 // get main form data
ezpl8_UsersPhysicalIdentity ezIDobj = db.ezpl8_UsersPhysicalIdentity.Find(id)

// http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/
// get partial form data for just this user's pictures
            ViewData["Picts"] = (from user in db.ezpl8_Users
                         from ui in user.ezpl8_Images
                         join image in db.ezpl8_Images
                         on ui.ImageID equals image.ImageID
                         where user.ezpl8_UserID == id
                         select new Picts
                         {
                             FileName = image.FileName,
                             ImageID = image.ImageID
                         }
                             ).ToList();

    return View(ezIDobj);
}
 

// Voici le contrôleur de vue partielle - pas grand chose! public ViewResult Picts (int id) { return View (ViewData ["Images"]); }

 [Authorize]  //you have to at least be logged on
public ActionResult DeletePicture(int id)
{
    //ToDo:  better security so a user can't delete another user's picture 
    //    TempData["ezpl8_UserID"]
    ezpl8_Images i = db.ezpl8_Images.Find(id);
    if (i != null)
    {
        var path = System.IO.Path.Combine(Server.MapPath("~/Content/Users"), i.FileName);
        System.IO.File.Delete(path: path);

        db.ezpl8_Images.Remove(i);
        db.SaveChanges();
    }
    return Redirect(Request.UrlReferrer.ToString());
}

protected override void Dispose(bool disposing)
{
    db.Dispose();
    base.Dispose(disposing);
}
 

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X