2009-12-15 9 views
33

Je demande mon avis partielle comme ceci:passer des paramètres à ma vue partielle?

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

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

+0

question très étroitement liée: http://stackoverflow.com/questions/6549541/how-to-pass-parameters-to-a-partial-view-in-asp- net-mvc –

Répondre

31

Vous pouvez passer un objet modèle à la partie (par exemple une liste de chaînes):

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

Ensuite vous tapez fortement la partie et la Model propriété 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> 
<% } %> 
+0

Si je crée une classe avec de nombreuses propriétés, je suppose que je dois initialiser cette classe dans mon contrôleur, puis dans la vue passer au contrôle de l'utilisateur? – mrblah

+0

Vous initialisez la classe dans le contrôleur, passez à la vue en tant que modèle et la vue rend le passage partiel du modèle. –

17

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

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

Comment accéder? Tout comme vous le feriez normalement avec une vue:

<%= Model.MagicSauce %> 
+9

+1 pour l'utilisation de MagicSauce –

6

Il a fallu un certain temps à couler, mais MVC signifie que vous utilisez un modèle, une vue et un contrôleur d'une manière ou d'une autre pour à peu près everythin g, y compris les vues partielles. Comment les trois éléments s'emboîtent peut être un peu intimidant au début. Je n'en avais jamais fait jusqu'à maintenant et ça marche - Woohoo!

J'espère que cela aidera la prochaine personne .... Désolé, j'utilise le rasoir au lieu de formulaires .Net. Je tire également des données d'une base de données SQL Server dans Entity Framework, qu'un développeur est susceptible d'utiliser. Je suis aussi allé un peu trop loin avec WebGrid, qui est tellement plus élégant qu'une déclaration foreach. Une base @ webgrid.GetHtml() affichera chaque colonne et chaque ligne.

Contexte

Dans cet exemple de travail, les utilisateurs ont téléchargé des photos. Leurs images sont affichées dans leur forme d'édition en utilisant une vue partielle. Les métadonnées ImageID et FileName sont conservées dans SQL Server pendant que le fichier lui-même est conservé dans le répertoire ~/Content/UserPictures.

Je sais que c'est un peu vaste, car tous les détails de téléchargement et d'édition de données personnelles ne sont pas affichés. Juste les parties germane l'utilisation d'une vue partielle se concentrent sur, mais avec quelques bonus EF jeté. L'espace de noms est MVCApp3 S & G.

Vue partielle Modèle ViewModels.cs

Les Images SQL Server La table inclut beaucoup plus de colonnes en plus de ImageID et FileName telles que [Légende], [Description], un hachage MD5 pour éviter que la même image soit téléchargée plusieurs fois et pour télécharger la date. Le ViewModel distille l'entité au strict minimum nécessaire pour qu'un utilisateur puisse voir ses images.

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

Vue principale Voir Edit.cshtml

Notez le CAST/convertir en typer le ViewData [].

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

Si vous ne définissez pas le modèle fortement typé à utiliser pour la vue partielle vous obtiendrez un "L'élément de modèle passé dans le dictionnaire est de type « System.Data.Entity.DynamicProxies. .. "erreur car il suppose que vous passer le modèle parent/maître.

Vue partielle sur Picts.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 IdentityController.cs

Définissez le contenu des données dans la ViewData ["MyPartialViewModelKeyName"] que votre vue partielle va consommer.Vous pouvez donner à la clé du dictionnaire le nom que vous voulez, mais je lui ai donné ViewData ["Picts"] Nom de fichier ew et sa définition de classe de modèle de vue. Etant donné que les images peuvent être partagées entre plusieurs utilisateurs, il existe une table plusieurs-à-plusieurs avec une requête PITA correspondante dans Entity Framework utilisant des fichiers imbriqués et des jointures internes pour renvoyer uniquement les images appartenant ou partagées 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); 
    } 
} 
+2

Vous basculez tellement génial. Vous avez épelé tout cela d'une manière qui a vraiment cliqué et m'a sauvé de manquer ma date limite. Je vous remercie d'avoir pris le temps de faire tout ça! Je vous remercie!!! – divamatrix

0
// 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); 
} 

// est ici la vue partielle contrôleur --not beaucoup à elle! public ViewResult Picts (int id) { return Voir (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); 
} 

}

Questions connexes