C# ASP.NET核心MVC-仅在一个页面上呈现部分视图
我有一个ViewBag.count的部分视图,它是在ShoppingCartController中定义的。问题是ViewBag仅在您处于ShoppingCart视图时显示。我希望在所有视图上都能看到ViewBag。我该如何解决这个问题?我当前正在按如下方式渲染部分:C# ASP.NET核心MVC-仅在一个页面上呈现部分视图,c#,html,asp.net-mvc,razor,asp.net-core-mvc,C#,Html,Asp.net Mvc,Razor,Asp.net Core Mvc,我有一个ViewBag.count的部分视图,它是在ShoppingCartController中定义的。问题是ViewBag仅在您处于ShoppingCart视图时显示。我希望在所有视图上都能看到ViewBag。我该如何解决这个问题?我当前正在按如下方式渲染部分: @Html.Partial("_ShoppingCart", new List<bytme.Models.ShoppingCartModel>()) @Html.Partial(“\u ShoppingCart”,ne
@Html.Partial("_ShoppingCart", new List<bytme.Models.ShoppingCartModel>())
@Html.Partial(“\u ShoppingCart”,new List())
名为_ShoppingCart的局部视图:
<span class="badge">@ViewBag.count</span>
@ViewBag.count
您应该创建一个单独的操作方法,该方法返回呈现页面购物车部分所需的HTML标记,并使用HTML.action方法将其包含在所有视图中
您还可以使用ChildActionOnly
属性来修饰此操作方法,以便用户不能通过请求url/ShoppingCart/Cart
直接访问此操作方法
[ChildActionOnly]
public ActionResult Cart()
{
ViewBag.ItemCount = 2; // replace hard coded value with your actual value
return PartialView();
}
在部分视图(~/Views/Shared/Cart.cshtml
)中,您可以编写页面购物车段所需的HTML代码
<span class="mycart">
Total items in cart @ViewBag.ItemCount
</span>
当razor执行您的视图时,它将看到这个Html.Action方法,它将被执行,并且该方法的输出(从Action方法生成的Html标记)将包含在为当前视图生成的最终输出中
我使用的是PartialView
方法,因此它不会尝试执行布局代码。(人们犯了这个错误,得到了对Cart action方法的无限调用
用于Asp.Net核心项目
如果要在asp.net核心项目中执行相同的操作,可以使用视图组件来实现相同的结果
创建视图组件以渲染购物车
public class CartViewComponent : ViewComponent
{
public IViewComponentResult Invoke(string name)
{
var totalItemCount = 3;
return View(totalItemCount);
}
}
在~/Views/Shared/Components/Cart
目录中为这个视图组件创建一个名为Default.cshtml
的razor视图,您可以在其中使用razor代码/HTML标记来呈现所需的HTML。在这个示例中,我使用了一种强类型方法,其中我的视图被强制类型化为int
类型和调用视图
方法时,我正在从调用
方法传递一个int值
@model int
<span>
Total items : @Model
</span>
<div>
@await Component.InvokeAsync("Cart")
</div>
<h1>Welcome to my site</h1>
您的零件没有
@model xxx
,因此正在传递新列表()
对它来说没有意义。而且部分不应该有
和
标记。如果您调用的控制器方法为ViewBag.count
设置了一个值,那么该值将显示在您的部分中。我尝试了这个方法,但是@Html.Action
不存在。只有@Html.ActionLink
是一个选项,您可以选择吗sing asp.net core?是的,我在问题中添加了.csproj
,其中包含asp.net core的PackageReferences
。我发布了一个更新的答案来处理asp.net core用例。它很有效!非常感谢,尽管我不需要在razor视图中调用该模型。真是太感谢你了!:)
<div>
@await Component.InvokeAsync("Cart")
</div>
<h1>Welcome to my site</h1>