[英]How to use Partial Views in ASP.NET MVC?
我正在構建一個ASP.NET MVC應用程序,並希望使用局部視圖來顯示我的產品類別。 它將成為一個網上商店,在每個頁面上,在菜單欄下面,我想顯示另一個包含所有產品類別的欄。
我想為此使用局部視圖。 目前在~/Views/Categories
我創建了局部視圖_CategoriesHeader.cshtml
。 (我通過在“創建新視圖”對話框中選擇“部分視圖”來做到這一點,所以它實際上是部分視圖)
_CategoriesHeader.cshtml
的內容如下:
@model IEnumerable<Webshop.Models.Category>
@{
Layout = null;
}
<ul>
@foreach (var category in Model)
{
<li>@Html.ActionLink(category.Name, "Category", "Categories", new { ID = category.CategoryID }, null)</li>
}
</ul>
現在在~/Views/Shared/_Layout.cshtml
我添加了以下代碼:
@Html.Partial("~/Views/Categories/_CategoriesHeader.cshtml", new Webshop.DAL.ShopContext().Categories.ToList())
我想知道這是否是使用需要模型的部分視圖的正確方法。 現在它只是內聯創建一個新的DbContext對象來獲取所有類別,但我認為擁有一個模型更好。 但我不知道該怎么做。 我做了一些其中CategoriesController.cs
有一個方法用於這個局部視圖,但是這不起作用,因為包含的視圖已經加載了自己的模型。
不。您不應在視圖中執行任何DAL操作。 我實際上建議只使用if
, foreach
和類似的陳述。 沒有其他的。 在控制器中准備數據並傳入。
您應該將new Webshop.DAL.ShopContext().Categories.ToList()
放入主視圖中使用的模型中,並將其傳遞給局部視圖。
@Html.Partial("~/Views/Categories/_CategoriesHeader.cshtml", Model.Categories)
如果要在列表中呈現數據,則可能需要foreach
。
如果要對每個頁面執行此操作,則應創建一個新操作,並讓該操作呈現,而不是部分視圖。 (該動作應調用局部視圖)。 該操作可以獲取所需信息並將其傳遞到視圖中。
@Html.Action("CategoriesHeader")
使用子操作。
ShopController.cs
[ChildActionOnly]
public ActionResult CategoryList()
{
var categories = new Webshop.DAL.ShopContext().Categories.ToList();
return PartialView("_CategoryList", categories);
}
_CategoryList.cshtml
@model IEnumerable<Webshop.Models.Category>
<ul>
@foreach (var category in Model)
{
<li>@Html.ActionLink(category.Name, "Category", "Categories", new { ID = category.CategoryID }, null)</li>
}
</ul>
_Layout.cshtml
@Html.Action("CategoryList", "Shop")
你可以做的是使用Html.Action或Html.RenderAction。 這可以避免從View中調用任何DAL。 你的控制器大多數都有注釋為ChildActionOnly的動作,並且在動作內部,如上面的回答注釋,使用返回PartialView。
另一種方法是從控制器返回局部視圖。 您的控制器操作將負責將模型加載到局部視圖中。 您的控制器代碼將如下所示:
public PartialViewResult GetYourPartialView(string id)
{
var vm = new yourviewmodel();
return PartialView("_YourPartialView", vm);
}
現在,你已經有一個加載的局部視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.