假设我有一份产品清单。我想在供应商页面上显示某个供应商的产品列表。我还想在产品页面上显示完整的产品列表。为此,我使用局部视图
@Html.Partial("_ProductList", Model.Products)
部分视图只是一个包含一堆列的基本表。
其中一列显示供应商名称。在产品页面上这很有用,但要显示用户何时已在供应商页面上,显示每个产品的供应商名称都没有用。
我想知道的是:将这种布局配置传递给局部视图的推荐方法是什么?
是否使用ViewData参数?
@Html.Partial("_CallList", Model.Calls, new ViewDataDictionary{{"HideCompany", true}})
当我这样做时,我发现在部分视图中我必须进行大量的投射,这真的会弄乱我的模板。
@if (!(bool)ViewData["HideCompany"])
{
<td>@Html.DisplayFor(modelItem => item.Name)</td>
}
另外,如果我想将Paginator放在局部视图中,如何在不指定actionName的情况下生成URL?
@Html.PagedListPager(Model, page => Url.Action("Index", new { page = page }));
动作名称不会相同,具体取决于嵌入部分视图的视图,因此我必须将其传递给ViewData中的部分视图。
@Html.Partial("_CallList", Model.Calls, new ViewDataDictionary{{"ActionName", "Details"}, {"HideCompany", true}})
它变得更加丑陋和丑陋。
@Html.PagedListPager(Model, page => Url.Action((string)ViewData["ActionName"], new { page = page }));
在我以前使用过的框架中,我没有必要指定操作名称,只是使用了当前活动的操作。
由于
答案 0 :(得分:2)
是否使用ViewData参数?
正如你已经看到的那样,这绝对是可怕的。
我想知道的是:推荐的方法是什么? 部分视图的布局配置?
当然使用视图模型:
public class ProductsViewModel
{
public IEnumerable<Product> Products { get; set; }
public bool HideCompany { get; set; }
public string PageAction { get; set; }
}
然后:
public class MainViewModel
{
public ProductsViewModel Products { get; set; }
}
然后:
@Html.Partial("_ProductList", Model.Products)
然后:
@if (Model.HideCompany)
{
<td>@Html.DisplayFor(modelItem => item.Name)</td>
}
然后:
@Html.PagedListPager(
Model.Products,
page => Url.Action(Model.ActionName), new { page = page })
)
依旧......