【问题标题】:C# Mvc 3, custom routing class?C# Mvc 3,自定义路由类?
【发布时间】:2011-06-20 12:55:22
【问题描述】:

如何在路由处理之前从路由中获取数据?

这样,我得到了以下网址:

localhost:1111/{eventid}/controller/method/id

{eventid} 将可用于整个应用程序中的几乎所有调用。现在我需要在我的 IOC 统一解析器获得控制器之前获得{eventid}。在控制器中,我得到了一个像这样统一配置的依赖项:

container.RegisterType<UserIdent>(new InjectionFactory(c =>
{
     ...
     return GetUser(User.Identity.Name, Session["EventId"].ToString());
}));

所以我需要在统一解决这个问题之前设置Session["EventId"]

所以基本上我只需要查看 EventId 是否存在于路由值中(在对依赖解析器进行任何调用之前)以及是否存在创建/更新具有 id 号的新会话。

2) 有没有更好的方法将该 id 传递给 unity,然后使用带有事件 id 的会话?
这将发生在用户提出的每个请求上。

【问题讨论】:

    标签: c# asp.net-mvc-3 routing unity-container


    【解决方案1】:

    这听起来像是使用动作过滤器的好例子。

    public class PopulateEventIdInSessionAttribute : ActionFilterAttribute
    {       
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {           
            object eventId = filterContext.ActionParameters["eventid"];
            if (eventId != null)
            {
                Session["EventId"] = (int)eventId;
            }
            base.OnActionExecuting(filterContext);
        }
    }
    

    【讨论】:

    • 工作就像一个魅力。有没有更好的方法然后使用 Sessions 将 eventid 传递给 unity?如上所示,Unity 根据请求创建它的新副本,我可以通过不涉及会话的任何其他方式传递事件 id 吗?
    • 我已经考虑过了,我想不出更好的方法。是否有可能更改设计以便不需要在实例化时传递它可能值得考虑?
    【解决方案2】:

    您可以尝试编写 Regex,它将解析 Url 并在 cookie 或会话中设置 eventId。 您可以在 BeginRequest 或 HttpModule 中实现此功能。

    对于我来说,我会编写自己的工厂,它将创建用户,而不是使用统一作为解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-15
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2011-04-02
      • 2020-04-15
      相关资源
      最近更新 更多