【发布时间】:2018-12-25 07:10:54
【问题描述】:
例如项目中很多页面都有类似的部分,需要从控制器获取数据。
我们可以为它创建局部视图:
查看模型类:
public class DriverProfilerSidebarVM
{
public DriverProfilerSidebarVM()
{
Trucks = new List<SelectListItem>();
Trailers = new List<SelectListItem>();
}
public int Id { get; set; }
[Display(Name = "Truck")]
public int? TruckId { get; set; }
public List<SelectListItem> Trucks { get; set; }
....
_ProfilerSidebar.cshtml:
@model Web.ViewModels.DriverProfilerSidebarVM
<div class="profile-sidebar">
<div class="portlet light profile-sidebar-portlet ">
<div class="profile-userpic">
<img src=@(!string.IsNullOrWhiteSpace(Model.AvatarUrl) ? Model.AvatarUrl : "/Images/coloricons/Driver-100.png") class="img-responsive" alt="Avatar Photo">
</div>
<div class="profile-usertitle">
<div class="profile-usertitle-name"> @Model.FirstName @Model.LastName </div><br />
<div class="profile-usertitle-name">@Model.Nickname</div>
</div>
<div class="profile-usermenu">
<ul class="nav-item nav page-sidebar-menu" data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200">
<li id="liProfile" class="active">
<a class="" href="@Url.Action("Edit", "Drivers",new { Model.Id })">
<i class="icon-user"></i> Driver Profile
</a>
</li>
那么使用它我们可以选择两种方式:
-
创建控制器方法并从页面调用它:
@Html.Action("_ProfilerSidebar", "Drivers", new { id = Model.Id }
和方法:
public ActionResult _ProfilerSidebar(int id, bool isEditTruckTrailer = false)
{
DriverProfilerSidebarVM model = ProfilerSidebar(id, isEditTruckTrailer);
return PartialView(model);
}
-
添加类型为 DriverProfilerSidebarVM 的属性以对每个页面进行建模,该页面使用此部分并对其进行渲染:
@Html.Partial("_ProfilerSidebar", Model.ProfilerSidebar)
两种方式都有效。两者各有优劣?
【问题讨论】:
-
这个问题的答案将在很大程度上取决于您的类的正确 OO 设计。是 X 有一个 Y 还是 X 是一个 Y。如果你很好地遵循了 OO,那么碎片就会开始落到适当的位置。
标签: asp.net-mvc partial-views asp.net-mvc-partialview