我这样称呼我的部分观点:
<% Html.RenderPartial("~/controls/users.ascx"); %>
我可以将参数传递给局部视图吗?我将如何在实际的users.ascx页面中访问它们?
答案 0 :(得分:31)
您可以将模型对象传递给partial(例如字符串列表):
<% Html.RenderPartial("~/controls/users.ascx", new string[] { "foo", "bar" }); %>
然后,您强烈键入partial,Model
属性将是适当的类型:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Collections.Generic.IEnumerable<string>>" %>
<% foreach (var item in Model) { %>
<div><%= Html.Encode(item) %></div>
<% } %>
答案 1 :(得分:17)
RenderPartial还有另一个重载,可以通过你的模型。
<% Html.RenderPartial("~/controls/users.ascx", modelGoesHere); %>
如何访问?就像你通常会对任何观点一样:
<%= Model.MagicSauce %>
答案 2 :(得分:6)
花了一段时间才沉入其中,但MVC意味着您可以以某种方式使用模型,视图和控制器,包括部分视图。三个元素如何组合在一起起初可能有点令人生畏。我从来没有做过,直到现在,它的确有效 - 喔!
希望这有助于下一个人......对不起,我使用剃须刀代替.Net表格。我还将数据从SQL Server数据库提取到Entity Framework,开发人员可能会使用它。我也可能对WebGrid有点过分了,它比foreach声明更优雅。基本的@ webgrid.GetHtml()将显示每个列和行。
在此工作示例中,用户已上传图片。他们的图片使用局部视图以编辑形式显示。 ImageID和FileName元数据在SQL Server中保留,而文件本身保存在〜/ Content / UserPictures目录中。
我知道它有点大,因为没有显示上传和编辑个人数据的所有细节。只是使用部分视图的密切关注部分,尽管有一些奖励EF投入。命名空间是S&amp; G的MVCApp3。
部分视图模型 ViewModels.cs
除了ImageID和FileName之外,SQL Server Images表还包含更多列,例如[Caption],[Description],MD5哈希以防止同一图像被多次上传,以及上传日期。 ViewModel将实体提取到用户查看图片所需的最低限度。
public class Picts
{
public int ImageID { get; set; }
public string FileName { get; set; }
}
主视图视图 Edit.cshtml
注意强制转换/转换为强类型ViewData []。
@Html.Partial(
partialViewName: "Picts",
model: (IEnumerable<MVCApp3.Models.Picts>)ViewData["Picts"]
)
如果您没有设置强类型模型用于部分视图,您将获得“传递到字典中的模型项的类型为'System.Data.Entity.DynamicProxies ... “错误,因为它假设您正在传递父/主模型。
部分视图视图 Picts.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”]与部分视图文件名及其视图模型类定义一致。
因为图片可能在多个用户之间共享,所以在Entity Framework中有一个多对多的表,其中包含相应的PITA查询,使用嵌套的from和内部联接来返回属于用户或与用户共享的图片:
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);
}
}
答案 3 :(得分: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);
}
//这是部分视图控制器 - 对它来说并不多见! public ViewResult Picts(int id) { 返回视图(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);
}
}