【问题标题】:How can I pass layout arguments to a partial view?如何将布局参数传递给局部视图?
【发布时间】:2015-02-25 18:05:18
【问题描述】:

假设我有一个产品列表。我想在供应商页面上显示某个供应商的产品列表。我还想在产品页面上显示完整的产品列表。为此,我使用局部视图

@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>
    }

另外,如果我想将我的分页器放在部分视图中,如何在不指定 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 }));

在我以前使用的框架中,我不必指定动作名称,它只使用当前处于活动状态的动作。

谢谢

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    是用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 })
    )
    

    等等……

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 2011-09-26
      • 2014-01-14
      • 1970-01-01
      • 2016-11-20
      相关资源
      最近更新 更多