C# ASP.NET核心MVC-仅在一个页面上呈现部分视图

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

我有一个ViewBag.count的部分视图,它是在ShoppingCartController中定义的。问题是ViewBag仅在您处于ShoppingCart视图时显示。我希望在所有视图上都能看到ViewBag。我该如何解决这个问题?我当前正在按如下方式渲染部分:

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