vistas vista ventana una pasar parciales parcial parametros pagina net mvc multiples modelos modal misma llamar desde datos controlador asp asp.net-mvc renderpartial

asp.net-mvc - ventana - vista parcial en modal mvc



pasar los parĂ¡metros a mi vista parcial? (4)

Estoy llamando mi vista parcial así:

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

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


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

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

Cómo acceder? Como lo harías normalmente con cualquier vista:

<%= Model.MagicSauce %>


Puede pasar un objeto modelo al parcial (por ejemplo, una lista de cadenas):

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

A continuación, escriba fuertemente la propiedad parcial y la del Model 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> <% } %>


Tardó un tiempo en asimilarlo, pero MVC significa que utiliza un Modelo, una Vista y un Controlador de una forma u otra para casi todo, 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 próxima 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.

Fondo

En este ejemplo de trabajo, los usuarios han subido imágenes. 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. Solo se enfocan las partes pertinentes del uso de una Vista parcial, aunque con un poco de EF extra. El espacio de nombre es MVCApp3 para S & G.

Vista parcial modelo ViewModels.cs

La tabla Imágenes del servidor SQL incluye muchas más columnas además de ImageID y FileName, como [Título], [Descripción], 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 Ver Edit.cshtml

Tenga en cuenta el lanzamiento / conversión para escribir fuertemente ViewData [].

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

Si no configura el modelo fuertemente tipado para usar en la Vista parcial, obtendrá un " El elemento del modelo pasado al diccionario tiene el tipo de error ''System.Data.Entity.DynamicProxies ... '' porque lo asume pasando el modelo padre / maestro.

Vista parcial Vista Picts.cshtml (se muestra todo el contenido del archivo)

@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 consistente con el nombre del archivo de vista parcial y su definición de clase de modelo de vista.

Debido a que las imágenes pueden compartirse entre múltiples usuarios, existe una tabla de muchos a muchos con una consulta PITA correspondiente en Entity Framework que utiliza froms anidados y combinaciones internas para devolver solo las imágenes que pertenecen o se 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); } }


// 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 hay mucho para eso! 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); }

}