2009-12-15 31 views
33

Estoy llamando a mi vista parcial de esta manera:pasando los parámetros a mi vista parcial?

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

¿Puedo pasar parámetros a vista parcial? ¿Cómo voy a acceder a ellos en la página real users.ascx?

+0

pregunta muy estrechamente relacionados: http://stackoverflow.com/questions/6549541/how-to-pass-parameters-to-a-partial-view-in-asp- net-mvc –

Respuesta

31

Se puede pasar un objeto de modelo a la parcial (por ejemplo, una lista de cadenas):

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

Entonces se escribe enérgicamente la parcial y la Model propiedad será del tipo apropiado:

<%@ 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 creo una clase con muchas propiedades, supongo que tengo que inicializar esa clase en mi controlador, y luego en la vista, pasarla al control de usuario? – mrblah

+0

Inicializa la clase en el controlador, pasa a la vista como modelo y la vista representa el repasado parcial del modelo. –

17

Hay otra sobrecarga para RenderPartial que pasará a su modelo.

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

¿Cómo acceder? Al igual que lo haría normalmente con cualquier punto de vista:

<%= Model.MagicSauce %> 
+9

+1 para el uso de MagicSauce –

6

se tomó un tiempo para hundirse, pero MVC significa que utiliza un modelo, una vista, y una forma controlador uno u otro para casi everythin g, incluidas las Vistas parciales. Cómo encajan los tres elementos juntos puede ser un poco intimidante al principio. Nunca había hecho uno hasta ahora, y funciona --¡Woohoo!

Espero que esto ayude a la siguiente persona ... Lo siento, estoy usando una rasuradora en lugar de formularios .Net. También estoy extrayendo datos de una base de datos de SQL Server en Entity Framework, que es probable que use un desarrollador. También probablemente fui un poco exagerado con WebGrid, que es mucho más elegante que un enunciado foreach. Un @ webgrid.GetHtml() básico mostrará cada columna y fila.

Antecedentes

En este ejemplo de trabajo, los usuarios han subido fotos. Sus imágenes se muestran en su forma de edición usando una vista parcial. Los metadatos ImageID y FileName se conservan en SQL Server, mientras que el archivo persiste en el directorio ~/Content/UserPictures.

Sé que es algo medio grande, porque no se muestran todos los detalles de la carga y edición de datos personales. Sólo las partes germano de la utilización de una vista parcial se centran en, aunque con una cierta prima EF lanzada. El espacio de nombres es MVCApp3 de S & G.

Vista parcial Modelo ViewModels.cs

Server Imágenes

El SQL table incluye muchas más columnas además de ImageID y FileName, como [Caption], [Description], un hash MD5 para evitar que la misma imagen se cargue varias veces y la fecha de carga. ViewModel destila la entidad hasta el mínimo necesario para que un usuario vea sus imágenes.

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

Vista principal Vista Edit.cshtml

Nota del fundido/convertir al tipo enérgicamente la ViewData [].

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

Si no se establece el modelo inflexible de tipos a utilizar para la Vista parcial obtendrá un "El elemento de modelo pasado en el diccionario es de tipo System.Data.Entity.DynamicProxies'. .. "error porque se supone que está pasando el modelo de padre/maestro.

vistas parciales Ver Picts.cshtml (el contenido del archivo se muestra enteros)

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

controlador IdentityController.cs

Establezca el contenido de datos en ViewData ["MyPartialViewModelKeyName"] que consumirá su vista parcial. Puede darle a la clave del diccionario el nombre que desee, pero le di el ViewData ["Picts"] para que sea coherente con el vi parcial Nuevo nombre de archivo y su definición de clase de modelo de vista.

Dado que las imágenes pueden compartirse entre varios usuarios, hay una tabla de muchos a muchos con una consulta PITA correspondiente en Entity Framework utilizando froms anidados y combinaciones internas para devolver solo las imágenes que pertenecen o comparten con un usuario :

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

Eres tan genial. Acabas de deletrear todo eso de una manera que realmente hizo clic y me salvó de perder mi fecha límite. ¡Te <3 por tomarte el tiempo de hacer todo eso! ¡¡¡Gracias!!! – 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); 
} 

// Aquí está el controlador de vista parcial --no tanto a él! public ViewResult Picts (ID int) { 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); 
} 

}

Cuestiones relacionadas