在不重复代码的情况下在局部视图中传递全局数据

passing global data in partial views without duplicating code

我有一个应用程序需要显示当前用户的用户名和图像。我可以将数据拉入视图模型并显示在视图中,但这意味着我需要在使用视图的每个控制器中执行此操作。有没有一种方法可以全局设置值并调用某些局部视图,而不必在每个控制器中重复复制它?

在我看来,您需要从 _Layout.cshtml 调用子操作。这是它的样子。

首先根据你所说的,我假设你的 viewModel 是这样的

public class UserDisplayViewModel
{
    public string UserName { get; set; }
    public string ImageUrl { get; set; }
}

您将需要一个负责获取用户名和图像数据的控制器。
它看起来像这样

public class UserController : Controller
{
    [ChildActionOnly]
    public ActionResult _userDisplay()
    {           
        var viewModel = GetUserNameAndImage();
        return View(viewModel);
    }

    private UserDisplayViewModel GetUserNameAndImage()
    {
      //code for getting the username and image data
    }
}

您可以像这样从 _layout.cshtml 文件中调用子操作

 @Html.Action("_userDisplay", "User")

您希望用户名和图片出现在 HTML 中的任何位置。

您还需要一个名为 _userDisplay.cshtml 的局部视图,其中包含您希望如何显示用户名和图像的标记。这是一个非常基本的例子

@model UserDisplayViewModel
@{    
    Layout = null;
}

<p>
    Username: @Model.UserName
</p>

<p>
    <img src="@Model.ImageUrl"/>
</p>