如何将布局参数传递给局部视图?

时间:2012-01-18 04:23:06

标签: c# asp.net-mvc

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

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

在我以前使用过的框架中,我没有必要指定操作名称,只是使用了当前活动的操作。

由于

1 个答案:

答案 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 })
)

依旧......