Asp.Net MVC有很多常量来处理控制器/动作重定向

时间:2011-06-07 06:25:49

标签: c# asp.net-mvc constants

我是否只是因为我们必须使用大量常量来处理不同控制器之间从一个动作到另一个动作的重定向这一事实,这只是我或其他任何人的烦恼。我试图实现一个基于反射的approch来解决这个问题,但是想知道其他人是如何接近这个的(如果你已经看到这个问题,当然:))

作为一个例子,我所做的是实现这样的东西来获得一个动作名称。

  public static string ActionName(Func<ActionResult> methodContainer)
        {
            return methodContainer.Method.Name;
        }

并获取控制器名称,

   public static string ControllerName<T>() where T : class
        {
            Type t = typeof (T);
            return t.Name.Replace(ControllerConstants.Controller, string.Empty);
        }

还有比这更好的方法吗?

/ Bumble Bee

4 个答案:

答案 0 :(得分:2)

查看MVCContrib库,下面的链接确切地说明了你正在处理的问题...它自MVC v1以来一直存在。

http://mvccontrib.codeplex.com/wikipage?title=RedirectToAction&referringTitle=Documentation

它也适用于nuget,因此应该很容易让它旋转。

http://nuget.org/List/Packages/MvcContrib.Mvc3-ci

答案 1 :(得分:1)

虽然我同意您应该在可用时使用受支持的库而不是自己编辑,但我认为值得分享的是,实现RedirectToAction实际上是相当困难的。下面的代码当然不完整,但总体思路成立并可用于将大量基于反射的逻辑转换为类型安全逻辑。

string ActionLink<TController, T>(Expression<Func<TController,T>> actionExpression, bool useQueryString = false)
        {
            var controllerName = typeof(T).Name;
            const string controllerPostfix = "Controller";
            if (controllerName.EndsWith(controllerPostfix, StringComparison.InvariantCultureIgnoreCase))
            {
                controllerName = controllerName.Substring(0, controllerName.Length - controllerPostfix.Length);
            }
            var expBody = (MethodCallExpression)actionExpression.Body;
            var method = expBody.Method;
            var parameters = method.GetParameters().ToArray();
            var arguments = string.Empty;
            if (useQueryString){
                arguments = GetQuerystring(expBody, parameters);
            } else{
                if (parameters.Length > 0)
                {
                    arguments = "/" + string.Join
                                            ("/",
                                             expBody.Arguments.Select
                                                 ((arg, i) => string.Format("{0}",GetValue(arg))).
                                                 ToArray());
                }

            }
            return "~/" + controllerName + "/" + expBody.Method.Name + arguments;
        }

正如我所说,上述内容并未处理所有可能性(为简洁起见,排除了两种方法)。 并且没有错误处理期望用户表现得很好,但上面的代码可以编写

ACtionLink((MyController c =&gt; c.ShowMeTheMoney(ThreatenWithGun:false,Shout:true));

可能并且将返回“〜/ My / ShowMeTheMoney / false / true”。因此,在需要时将类型安全表达式转换为字符串(或任何其他格式)并不需要花费太多精力,并且需要执行此操作所需的大部分内容可以在完全不同的场景之间重用(例如上面使用的GetValue方法)能够遍历表达式树以获取由该表达式树表示的值)

答案 2 :(得分:0)

我会认真看看fubumvc及其行动。它更好地解决了这个问题。此外,作者非常有帮助和反应灵敏。

希望这有帮助

答案 3 :(得分:0)

您的操作名称提取方法完全不正确。如果您对操作使用ActionName属性,则您的方法将返回不正确的操作名称。如果您想要消除字符串的使用并减少编写常量的工作量,请尝试T4MVC。它只会消除在asp.net mvc中编写常量的所有需求。它会自动为控制器名称,视图名称,操作名称等生成常量。