передача параметров в мое частичное представление?
Я вызываю свое частичное представление следующим образом:
<% Html.RenderPartial("~/controls/users.ascx"); %>
могу ли я передать параметры в частичное представление? Как я получу доступ к ним в реальных пользователях.страница ascx-файл?
4 ответов
вы можете передать объект модели частичному (например, список строк):
<% Html.RenderPartial("~/controls/users.ascx", new string[] { "foo", "bar" }); %>
тогда вы сильно набираете частичное и Model
свойство будет соответствующего типа:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Collections.Generic.IEnumerable<string>>" %>
<% foreach (var item in Model) { %>
<div><%= Html.Encode(item) %></div>
<% } %>
существует еще одна перегрузка для RenderPartial, которая будет передавать вашу модель.
<% Html.RenderPartial("~/controls/users.ascx", modelGoesHere); %>
Как получить доступ? Так же, как вы обычно с любым видом:
<%= Model.MagicSauce %>
потребовалось некоторое время, чтобы погрузиться, но MVC означает, что вы используете модель, представление и контроллер так или иначе для всего, включая частичные представления. Как все три элемента вместе может быть немного пугающим сначала. Я никогда не делал ничего подобного до этого момента, и это работает ...
надеюсь, это поможет следующему человеку.... Извините, я использую razor вместо .Net-форм. Я также извлекаю данные из базы данных SQL Server в Entity Framework, что, вероятно, является разработчиком использовать. Я также, вероятно, немного переборщил с WebGrid, что намного элегантнее, чем утверждение foreach. Базовые @webgrid.GetHtml () отобразит каждый столбец и строку.
фон
в этом рабочем примере, пользователи загрузили фотографии. Их изображения отображаются в форме редактирования с использованием частичного представления. Метаданные ImageID и FileName сохраняются в SQL Server, а сам файл сохраняется в каталоге ~/Content/UserPictures.
Я знаю, что это своего рода половина, потому что все детали загрузки и редактирования личных данных не отображаются. Просто важные части использования частичного представления сосредоточены, хотя и с некоторым бонусом EF. Пространство имен MVCApp3 для S & G.
Частичный Вид Модели ViewModels.cs
таблица образов SQL Server включает в себя еще много столбцов в дополнение к ImageID и имени файла, например [Caption], [Description], хэш MD5 для предотвращения одно и то же изображение загружается несколько раз, и Дата загрузки. ViewModel перегоняет сущность до минимума, необходимого пользователю для просмотра своих изображений.
public class Picts
{
public int ImageID { get; set; }
public string FileName { get; set; }
}
Основной Вид Вид правка.cshtml по
обратите внимание на приведение / преобразование, чтобы строго ввести ViewData[].
@Html.Partial(
partialViewName: "Picts",
model: (IEnumerable<MVCApp3.Models.Picts>)ViewData["Picts"]
)
если вы не установите строго типизированную модель для использования для частичного просмотра, вы получите"элемент модели, переданный в словарь, имеет тип - Система.Данные.Сущность.DynamicProxies..." ошибка, потому что она предполагает, что вы передаете родительскую/мастер-модель.
Частичный Вид Пикты.cshtml (отображается все содержимое файла)
@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>)
))
контроллер IdentityController.cs
установите содержимое данных в ViewData ["MyPartialViewModelKeyName"] ваше частичное представление будет потреблять. Вы можете дать ключ словаря любое имя, которое вы хотите, но я дал ему ViewData ["Picts"], чтобы быть в соответствии с именем файла частичного представления и его определением класса модели представления.
поскольку изображения могут быть разделены между несколькими пользователями, существует таблица "многие ко многим" с соответствующим запросом PITA в Entity Framework с использованием вложенных froms и внутренних соединений для возврата только изображений, принадлежащих пользователю или совместно с ним:
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);
}
/ / вот контроллер частичного просмотра-не так много! 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);
}
}