2009-12-15 20 views
33

io chiamo la mia vista parziale in questo modo:passare parametri alla mia vista parziale?

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

Posso passare parametri a vista parziale? Come posso accedervi nella pagina users.ascx effettiva?

+0

Domanda molto strettamente correlati: http://stackoverflow.com/questions/6549541/how-to-pass-parameters-to-a-partial-view-in-asp- net-mvc –

risposta

31

Si potrebbe passare un oggetto modello per il parziale (ad esempio una lista di stringhe):

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

Poi si digita con forza il parziale e la Model proprietà sarà del tipo appropriato:

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

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

se creo una classe con molte proprietà, suppongo di dover inizializzare quella classe nel mio controller, quindi nella vista passarla al controllo utente? – mrblah

+0

Si inizializza la classe nel controller, pass è la vista come modello e la vista esegue il restro parziale del modello. –

17

C'è un altro sovraccarico per RenderPartial che passerà il tuo modello attraverso.

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

Come accedere? Proprio come si farebbe normalmente con qualsiasi vista:

<%= Model.MagicSauce %> 
+9

+1 per l'utilizzo di MagicSauce –

6

Ci sono voluti un po 'per affondare in, ma MVC significa che utilizza un modello, una vista, e un modo di controllo uno o l'altro per quasi everythin g, comprese le viste parziali. In che modo tutti e tre gli elementi si uniscono possono essere un po 'intimidatori all'inizio. Non ne avevo mai fatto uno fino a ora, e funziona - Woohoo!

Spero che questo aiuti la persona successiva .... Scusa, sto usando il rasoio al posto dei moduli .Net. Sto anche estraendo dati da un database SQL Server in Entity Framework, che è probabile che uno sviluppatore utilizzi. Probabilmente ho anche esagerato con WebGrid, che è molto più elegante di un'istruzione foreach. Un semplice @ webgrid.GetHtml() mostrerà ogni colonna e riga.

Sfondo

In questo esempio di lavoro, gli utenti hanno caricato le immagini. Le loro immagini sono visualizzate nella loro forma di modifica usando una vista parziale. I metadati ImageID e FileName vengono mantenuti in SQL Server mentre il file stesso viene mantenuto nella directory ~/Content/UserPictures.

So che è un po 'vasto, perché non vengono mostrati tutti i dettagli del caricamento e della modifica dei dati personali. Solo le parti germano di utilizzare una vista parziale si concentrano su, anche se con qualche bonus EF gettato in. Lo spazio dei nomi è MVCApp3 per S & G.

parziale sul modello ViewModels.cs

Immagini

SQL Server tabella include molte più colonne oltre a ImageID e FileName come [Caption], [Description], un hash MD5 per impedire che la stessa immagine venga caricata più volte e data di caricamento. ViewModel distilla l'Entity fino al minimo necessario affinché un utente possa vederne le immagini.

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

principale Vista Edit.cshtml

nota il cast/convertire tipo con forza il Viewdata [].

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

Se non si imposta il modello fortemente tipizzato da utilizzare per la Vista parziale si otterrà un "La voce modello di passato nel dizionario è di tipo System.Data.Entity.DynamicProxies'. .. errore "perché si presuppone che stai passando il/modello master genitore.

Parziale Vista Picts.cshtml (il contenuto intero file è mostrato)

@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>) 
      )) 

controller IdentityController.cs

Impostare il contenuto dei dati nel ViewData ["MyPartialViewModelKeyName"] la visualizzazione parziale verrà consumata.È possibile dare il tasto dizionario qualsiasi nome desiderato, ma ho dato ViewData ["Foto"] per essere coerenti con il parziale vi ew nome del file e la sua definizione della classe del modello di vista.

Poiché le immagini possono essere condivise tra più utenti, esiste una tabella molti-a-molti con una query PITA corrispondente in Entity Framework che utilizza nidificati e join interni per restituire solo le immagini appartenenti o condivise con un utente :

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

Ti piace tanta meraviglia. Hai appena scritto tutto ciò in un modo che mi ha veramente colpito e mi ha salvato dal perdere la mia scadenza. Io <3 tu per aver dedicato del tempo a fare tutto questo! Grazie!!! – 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); 
} 

// Ecco il parziale View controller --non molto da esso! 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); 
} 

}

Problemi correlati