【问题标题】:mvc 5 run function on every page load [duplicate]mvc 5在每个页面加载时运行功能[重复]
【发布时间】:2016-06-03 05:39:13
【问题描述】:

我在堆栈上搜索的许多答案都与旧版本的 asp.net mvc 有关,所以我想发布一个新问题,因为它与在每个页面加载时运行一个函数有关特定于 mvc5 。我基本上想在每次页面加载时运行一个查询。

read 以下是与 mvc 3 相关的,但它有点令人困惑,并没有真正提供任何帮助。我想将以下代码移动到“全局”函数中:

namespace MVC5.Controllers
{
  public class LoginController : Controller
  {
    private LoginDataContext context;        

    public LoginController()
    {
        context = new LoginDataContext();
    }   

    public ActionResult Index()
    {
        int item=1;
        List<int> foo = context.ExecuteQuery<int>("SELECT foo from bar where id={0}", item).ToList();            
        foreach (var item in isUpdating)
        {      
          //if logic .....
          return PartialView("DbUpdate");
        }
        return RedirectToAction("Index", "Home");
    }
  }
}

更新

this articlethis article 的帮助下,我得以完成这项工作。我不想将其标记为重复 b/c 我真的不知道在哪里创建这些文件(例如模型文件夹、控制器文件夹等)。我对 MVC 还是很陌生,所以如果有人不同意,我很乐意将其标记为骗子。以下是我用来解决问题的步骤。

在模型文件夹“MyActionFilter.cs”中创建:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVC5.Controllers;

namespace MVC5.Models
{
    public class MyActionFilter : ActionFilterAttribute
    {       
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {  
            var dbUpdate = new DbUpdateController();
            int nomz=1;
            if (nomz==1)
            {
               filterContext.Result = dbUpdate.Index();
            }
        }
    }
}

然后我将它添加到我的 FilterConfig.cs 文件中,如下所示:

using System.Web;
using System.Web.Mvc;
using MVC5.Models;

namespace MVC5
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new MyActionFilter());  
        }        
    }
}

控制器看起来像这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVC5.Controllers
{
    public class DbUpdateController : Controller
    {
        // GET: DbUpdate
        public ActionResult Index()
        {
            return View("DbUpdate");
        }       

    }
}

【问题讨论】:

  • 很多不同的方法来实现这一点。 OnActionExecuting 只是一个:msdn.microsoft.com/en-us/library/…
  • @mxmissile 谢谢!我更新了我的答案以使用OnActionExecuting
  • @MikeDebela 我使用了您建议的文章作为可能的欺骗,但它与另一篇文章结合使用。我在回答中表示,我还不愿意将此标记为欺骗,但请告诉我您的想法

标签: c# asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

对于这样的事情,我喜欢创建自定义属性,然后您可以在控制器和/或操作级别上定义它,这样您就可以灵活地不在某些地方使用它。

如果你对此感兴趣

https://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute(v=vs.118).aspx

我也忘记了全局操作过滤器 http://weblogs.asp.net/gunnarpeipman/asp-net-mvc-3-global-action-filters

以及它们在 mvc5 中的覆盖

http://davidhayden.me/blog/filter-overrides-in-asp-net-mvc-5

它们非常简单。像往常一样定义一个动作过滤器,并在你的 Application_Start() 中添加

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

在您的 App_Start\FilterConfig.cs 文件中

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new YOURCUSTOMFILTER );
     }

【讨论】:

  • 不幸的是,我有很多控制器,需要在每次页面加载时运行此方法
  • 没有 ajax 动作或类似的东西?即使在这种情况下,您也只需要使用控制器类定义上的属性标记每个控制器一次。 ActionFilters 可以特定于单个动作,或者如果控制器被标记,那么控制器中的所有动作都会得到它。
  • 另见全局过滤器更新
  • 谢谢,保罗!我将您的过滤器建议与其他一些编码更改结合使用。见上面的更新
  • 很高兴它成功了。我们通常将它们放在 MVC 项目中的“Filters”文件夹中,如果我们要制作大量属性,则将它们放在引用项目中的“attributes”文件夹中。
猜你喜欢
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 2012-12-18
相关资源
最近更新 更多