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

问题描述 投票:0回答:1

这段代码显示了如何设置然后从TempData对象读取数据:

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

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

/// <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与我想要实现的完全不同。

有任何想法吗?干杯

c# asp.net-core asp.net-core-mvc extension-methods tempdata
1个回答
4
投票

您可以沿着Extension方法的路径前进

看起来很整洁:

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,因为我认为你不能覆盖它。这可能会使基类变得混乱,并且您将在每个单独的控制器中包含很多功能,您将使用此基类并可能共享您不需要的功能。

© www.soinside.com 2019 - 2024. All rights reserved.