C# 实现跟踪用户是否重复搜索的功能

C# 实现跟踪用户是否重复搜索的功能,c#,asp.net-mvc,post-redirect-get,C#,Asp.net Mvc,Post Redirect Get,我有一个视图模型,它表示可用于搜索的所有字段。我想添加一些逻辑,能够识别搜索值是否都相同,并确定是否再次点击数据库进行查询 我想我得做点像 用户提交表单后,将表单值保存到某些 临时场 第二次提交时,将临时值与表单值集合进行比较 如果值相等,则在视图中设置属性 模型IsSameSearch=true 我还想使用Post-Redirect-Get模式。因此,我的搜索视图除了将表单值发布到另一个处理和过滤数据的操作之外,什么都不做,然后使用Ajax“获取”数据 SearchViewModel包含许

我有一个视图模型,它表示可用于搜索的所有字段。我想添加一些逻辑,能够识别搜索值是否都相同,并确定是否再次点击数据库进行查询

我想我得做点像

  • 用户提交表单后,将表单值保存到某些 临时场
  • 第二次提交时,将临时值与表单值集合进行比较
  • 如果值相等,则在视图中设置属性 模型IsSameSearch=true
我还想使用Post-Redirect-Get模式。因此,我的搜索视图除了将表单值发布到另一个处理和过滤数据的操作之外,什么都不做,然后使用Ajax“获取”数据

SearchViewModel包含许多搜索参数。这是一个缩写版本

    public bool UseAdvancedSearch { get; set; }
    public bool isSameSearch { get; set; }
    /// <summary>
    /// Gets or sets the page.
    /// </summary>
    [HiddenInput]
    [ScaffoldColumn(false)]
    public int Page { get; set; }

    [HiddenInput]
    [ScaffoldColumn(false)]
    public string SortOption { get; set; }

    /// <summary>
    ///     Gets or sets the address keywords.
    /// </summary>
    [Display(Name="Address")]
    public string AddressKeywords { get; set; }

    /// <summary>
    ///     Gets or sets the census.
    /// </summary>
    public string Census { get; set; }

    /// <summary>
    ///     Gets or sets the lot block sub.
    /// </summary>
    public string LotBlockSub { get; set; }

    /// <summary>
    ///     Gets or sets the owner keywords.
    /// </summary>
    [Display(Name="Owner")]
    public string OwnerKeywords { get; set; }

    /// <summary>
    ///     Gets or sets the section township range.
    /// </summary>
    public string SectionTownshipRange { get; set; }

    /// <summary>
    ///     Gets or sets the strap.
    /// </summary>
    ///
    [Display(Name="Account Number/Parcel ID")]
    public string Strap { get; set; }

    /// <summary>
    ///     Gets or sets the subdivision.
    /// </summary>
    public string Subdivision { get; set; }

    /// <summary>
    /// Gets or sets the use code.
    /// </summary>
    [Display(Name = "Use Code")] 
    public string UseCode { get; set; }

    /// <summary>
    ///     Gets or sets the zip code.
    /// </summary>
    [Display(Name="Zip Code")]
    public string ZipCode { get; set; }
public bool UseAdvancedSearch{get;set;}
公共布尔isSameSearch{get;set;}
/// 
///获取或设置页面。
/// 
[HiddenInput]
[脚手架立柱(假)]
公共整型页{get;set;}
[HiddenInput]
[脚手架立柱(假)]
公共字符串排序选项{get;set;}
/// 
///获取或设置地址关键字。
/// 
[显示(Name=“Address”)]
公共字符串地址关键字{get;set;}
/// 
///获取或设置普查。
/// 
公共字符串普查{get;set;}
/// 
///获取或设置地块块子对象。
/// 
公共字符串LotBlockSub{get;set;}
/// 
///获取或设置所有者关键字。
/// 
[显示(Name=“Owner”)]
公共字符串所有者关键字{get;set;}
/// 
///获取或设置节范围。
/// 
公共字符串部分TownshipRange{get;set;}
/// 
///获取或设置皮带。
/// 
///
[显示(Name=“账号/包裹ID”)]
公共字符串{get;set;}
/// 
///获取或设置细分。
/// 
公共字符串细分{get;set;}
/// 
///获取或设置使用代码。
/// 
[显示(Name=“使用代码”)]
公共字符串UseCode{get;set;}
/// 
///获取或设置邮政编码。
/// 
[显示(名称=“邮政编码”)]
公共字符串ZipCode{get;set;}

您所描述的内容称为缓存

在您的场景中实现这一点的一种方法是实现
GetHashCode()
,它将考虑所有字段/属性以计算唯一值。这样,您就可以使用哈希作为缓存中的键条目,并使用该键存储结果

对于实际的缓存,如果不部署到web场,则可以使用.Net Framework提供的类


此外,如果您熟悉IoC和DI(例如使用Unity),那么类似的东西可以作为拦截器实现,并且只需要向要缓存的方法添加属性。这样,您只需将缓存作为一个交叉关注点来实现一次,而不会用这样的东西填充您的应用程序代码。

您所描述的就是所谓的缓存

在您的场景中实现这一点的一种方法是实现
GetHashCode()
,它将考虑所有字段/属性以计算唯一值。这样,您就可以使用哈希作为缓存中的键条目,并使用该键存储结果

对于实际的缓存,如果不部署到web场,则可以使用.Net Framework提供的类


此外,如果您熟悉IoC和DI(例如使用Unity),那么类似的东西可以作为拦截器实现,并且只需要向要缓存的方法添加属性。这样,您只需将缓存作为一个交叉关注点实现一次,而不必用类似的东西填充应用程序代码。

如果您从Entity Framework获取数据,您可以在EF级别缓存数据。看看扩展的包实体框架。它非常简单,只需将method.FromCache()添加到用于检索和筛选数据的查询中,它就会缓存查询结果。确保使用includes等加载所有需要的数据

您不必担心在模型中进行相同的搜索,因为缓存提供程序会查看过滤器设置并确定它是不同的。或者,在筛选之前缓存数据,然后筛选缓存的结果。如果您有大量具有显著差异的过滤器参数,这更合适,因为您只需缓存一个较大的结果,而不是数千个较小的结果


您可以更高级,并指定缓存周期,例如缓存10分钟

如果您从Entity Framework获取数据,则可以在EF级别缓存数据。看看扩展的包实体框架。它非常简单,只需将method.FromCache()添加到用于检索和筛选数据的查询中,它就会缓存查询结果。确保使用includes等加载所有需要的数据

您不必担心在模型中进行相同的搜索,因为缓存提供程序会查看过滤器设置并确定它是不同的。或者,在筛选之前缓存数据,然后筛选缓存的结果。如果您有大量具有显著差异的过滤器参数,这更合适,因为您只需缓存一个较大的结果,而不是数千个较小的结果


您可以更高级,并指定缓存周期,例如缓存10分钟

所以要清楚,您想要一个“缓存”模式?所以要清楚,您想要一个“缓存”模式?可以缓存多大的结果集?用户可以从简单的主页上搜索“父模型”属性以及“孙子”属性~280k条记录,执行的搜索,有点交叉模型。他们可以搜索建筑类型,但这是建筑的属性