【问题标题】:Database selection before routing in ASP.Net MVCASP.Net MVC 中路由前的数据库选择
【发布时间】:2014-10-13 14:51:39
【问题描述】:

我正在 asp.net mvc 4 中寻找一种方法,在进行任何路由之前从 web.config 中选择数据库设置,例如 codeigniter(php) 中的预路由挂钩。保存这些设置会话或上下文对象的最佳方法是什么? PS我是asp.net mvc的新手。

这里提到的类似这样的 php 代码:Running a database query before every route runs

【问题讨论】:

  • “任何路由”是什么意思?是指在会话期间第一次访问页面或网站吗?如果您想在会话开始时做某事,请尝试使用Global.asax 中的Session_Start 方法。

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


【解决方案1】:

您是要求从 Web.Config 还是从数据库中获取值? 这有点令人困惑,但这里有一些代码可以两者兼得。

您可以创建自己的路由处理程序,在这里您可以做任何您想做的事。 然后在 RouteConfig.cs 中,确保使用自己的 Route Handler。

这是 MyRouteHander.cs

using System;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace My.Services
{
    public class MyRouteHander : IRouteHandler
    {
         ApplicationDbContext Db = new ApplicationDbContext();
         public IHttpHandler GetHttpHandler(RequestContext requestContext)
         {

             // Get route data values
             var routeData = requestContext.RouteData;
             var action = routeData.GetRequiredString("action");
             var controller = routeData.GetRequiredString("controller");

             // Get webconfig settings
             var webConfigSetting = ConfigurationManager.AppSettings["SOME_FANCY_SETTING"]
             if (!string.IsNullOrEmpty(webConfigSetting))
             {
                requestContext.RouteData.Values["action"] = webConfigSetting;
                return new MvcHandler(requestContext);
             }

             // If we have SomeDataBaseTable hit we do something else.
             if (Db.SomeDataBaseTable.Any(x => x.Action == action))
             {
                 // Lets do something with the requestContext.
                 string actionName = "SpecialAction";
                 requestContext.RouteData.Values["action"] = actionName;
                 requestContext.RouteData.Values["controller"] = "SpecialController";
                 requestContext.RouteData.Values.Add("id", Db.SomeDataBaseTable.FirstOrDefault(x => x.Action == action).Id);
             }
             return new MvcHandler(requestContext);
         }
     }
 }

App_Start/RouteConfig.cs 更新 routes.MapRoute() 以便它使用您的 MyRouteHander。

routes.MapRoute(
      "Home",
      "Home/{action}/{id}",
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new[] { "MyProject.Controllers" }
    ).RouteHandler = new MyRouteHander();

    routes.MapRoute(
      "Default",
      "{controller}/{action}/{id}",
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new[] { "MyProject.Controllers" }
    ).RouteHandler = new MyRouteHander();
...

希望这会有所帮助!

【讨论】:

  • 别忘了Dispose你的ApplicationDbContext;)。使用using 块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
相关资源
最近更新 更多