C# asp.net mvc-在操作之间重用控制器值

C# asp.net mvc-在操作之间重用控制器值,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个主登录页的初始页,我需要在其中进行服务呼叫。该模型的值将帮助我确定是否显示另一个页面/操作 让我们选择一个场景,查看日期如果它是过去的,我将显示一个新的页面/动作查看数据,该页面/动作查看数据仅位于同一个controller.cs类中。如果该日期是将来,我将显示另一个页面/操作摘要,该页面/操作摘要也使用相同的.cs控制器类 现在,如果我转到ReviewData,我需要与前面相同的服务调用数据。我不想时不时地进行此服务调用,因为所有这些尝试都具有相同的价值。如何避免这种情况,并尽可能重用

我有一个主登录页的初始页,我需要在其中进行服务呼叫。该模型的值将帮助我确定是否显示另一个页面/操作

让我们选择一个场景,查看日期如果它是过去的,我将显示一个新的页面/动作查看数据,该页面/动作查看数据仅位于同一个controller.cs类中。如果该日期是将来,我将显示另一个页面/操作摘要,该页面/操作摘要也使用相同的.cs控制器类


现在,如果我转到ReviewData,我需要与前面相同的服务调用数据。我不想时不时地进行此服务调用,因为所有这些尝试都具有相同的价值。如何避免这种情况,并尽可能重用第一次服务调用中的数据/模型值?

问题的答案: -是否可以重用第一次服务调用中的数据/模型值? -对。
您可以使用Tempdata实现这一点:

您需要一些缓存策略这里是简单的缓存帮助器类

using System.Runtime.Caching;  

public class cacheservice: ICacheservice
{
    public T GetOrSet<T>(string cacheKey, Func<T> getItemCallback) where T : class
    {
        T item = MemoryCache.Default.Get(cacheKey) as T;
        if (item == null)
        {
            item = getItemCallback();
            MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(10));
        }
        return item;
    }
}

interface ICacheService
{
    T GetOrSet<T>(string cacheKey, Func<T> getItemCallback) where T : class;
}
缓存提供程序将根据缓存中的CACHEKEY名称检查是否有任何内容,如果没有,它将调用委托方法来获取数据并将其存储在缓存中

例如:


您也可以根据自己的需要进行定制

请您展示代码示例控制器上的缓存模型不是MVC的设计方式。但我仍然觉得,即使在两个不同的动作下,再次拨打相同的服务电话在一个应用程序中多次获取相同的数据是不值得的,不是吗?我在同一个控制器类下执行这两个操作。一个操作生成服务响应数据,为什么不能,或者如何在另一个操作中重用它而不进行相同的服务调用?这是用参数实现的吗?我很抱歉。我可能是这个主题的初学者,但作为asp.net经典世界的长期开发人员,我仍然不相信所列出的选项。为什么MVC框架没有像我的场景那样的能力?还是我还没有掌握MVC的基本功能?如果我需要避免多个web服务调用,并利用后续需求的值,那么除了会话之外还有什么其他选项,缓存是另一个或多或少类似于我的会话的存储。请详细说明或帮助我了解这些主题的一些链接/来源,特别是asp.net MVC上的链接/来源?哦,没有问题,我可以理解您的担忧,但当我们使用MVC创建应用程序时,会出现性能问题,您的场景与性能问题类似,对吗?如果您发现如何提高MVC应用程序的性能,世界各地都有很多文章,但您会发现一个常见的问题是缓存,尽管MVC使用OutputCache提供内置缓存,但它不符合您的要求,因此您需要制定一些缓存策略。请参阅一些有用的链接,还有一点是所有链接都有一个共同点,那就是缓存,我希望您会满意,并为您的应用程序实现一些缓存策略-对这真的帮助了我。很抱歉反应太晚了。我认为这是解决我的问题的需要。任何正在查看此主题和答案的人,请在评论部分查找链接和主题。
cacheservice.GetOrSet("CACHEKEY", (delegate method if cache is empty));
var Data=cacheService.GetOrSet("CACHEKEY", ()=>SomeRepository.GetData())