【问题标题】:Add extension method to TempData object in asp.net core在 asp.net core 中为 TempData 对象添加扩展方法
【发布时间】:2019-03-29 14:22:57
【问题描述】:

这段代码展示了如何设置然后从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】:

    你可以走扩展方法的道路

    看起来很整洁:

    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"); 来设置它

    类似地创建设置/更新功能。

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

    【讨论】:

    • 请在您的答案中添加设置功能
    • public static void SetErrorMessage(this ITempDataDictionary @this, string value) =&gt; @this["ErrorMessage"] = value;这样的?
    • @Goldenage 不幸的是,这是一个语句而不是表达式,因为您正在管理状态而不是评估任何内容。
    • 我只是想知道当 @this[_ERROR] 的值为 null 时 GetErrorMessage 是否会爆炸
    • @GoldenAge 在答案中添加了一个空检查
    猜你喜欢
    • 2015-07-22
    • 2020-01-29
    • 2013-01-30
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多