向 asp.net 核心中的 TempData 对象添加扩展方法

Add extension method to TempData object in asp.net core

这段代码展示了如何设置并从 TempData 对象中读取数据:

TempData["ErrorMessage"] = "some message";
var foo = TempData["ErrorMessage"];

如果我必须在我的应用程序中经常使用 TempData["ErrorMessage"],那么在开发新东西时总是存在在密钥中输入错误的风险。 我正在考虑一种更安全的方法来防止这种情况发生,所以我创建了一个 class:

/// <summary>
/// Contains a list of keys which are used in TempData across the controllers
/// </summary>
public static class TempDataKeys
{
    /// <summary>
    /// Stores the error message which is optionally dispalyed in the Shared/_ErrorMessage partial view defined in the _Layout.cshtml
    /// </summary>
    public const string ErrorMessage = "ErrorMessage";
}

然后像这样设置和读取数据:

TempData[TempDataKeys.ErrorMessage] = "some message";
var foo = TempData[TempDataKeys.ErrorMessage];

现在我在想是否有另一种方法可以通过为 TempData 创建扩展方法来实现类似的事情,这样我就可以像这样设置和读取数据

TempData.ErrorMessage = "some message";
var foo = TempDataKeys.ErrorMessage;

我知道它可能看起来像使用 ViewBag 但是,我需要有 ViewBag 没有的编译时安全性。无论如何,ViewBag 与我想要实现的完全不同。

有什么想法吗? 干杯

您可以沿着扩展方法的道路前进

看起来很整洁:

public static class Extension
{
    public const string _ERROR = "ErrorMessage";

    public static void SetErrorMessage(this ITempDataDictionary @this, string message)
    {
        @this[_ERROR] = message;
    }

    public static string GetErrorMessage(this ITempDataDictionary @this) =>
        @this[_ERROR]?.ToString();
}

然后你可以像这样得到它 var message = TempData.GetErrorMessage(); 你可以使用 TempData.SetErrorMessage("Some Error");

来设置它

类似地创建 Set/Update 个函数。

我认为实现此目的的另一种方法是扩展 Controller/PageModel,您将在其中实现自己的 TempData,因为我认为您无法覆盖它。这可能会使基础 class 变得混乱,并且您实际上将在每个控制器中包含大量功能,您将在其中使用该基础 class 并且可能会共享您不需要的功能。