2011-06-07 44 views
2

它是只是我还是让别人恼火的事实是,我们必须使用很多常量来处理从一个动作到另一个动作的重定向跨越不同的控制器。我试图实施基于反思的解决方案来解决这个问题,但想知道其他人如何接近这个(如果你已经看到这是一个问题,当然:))Asp.Net MVC很多常量来处理控制器/动作重定向

作为一个例子,我所做的是实现像这样得到一个行动名称。

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

回答

0

我会认真看fubumvc和它的行动。它解决了这个问题要好得多。此外,作者是超级有用和响应。

希望这有助于

+0

我知道,甚至单轨是pret ty好。但现在我们已经从MS获得了一些可靠的东西,我认为最好坚持下去,直到它被证明是另一回事。所以,感谢您的建议,但我想知道这是如何处理在asp.net mvc;) – Illuminati 2011-06-07 06:36:35

0

你的动作名称提取方法是根本不正确。如果您的动作使用ActionName属性,则您的方法将返回不正确的动作名称。如果您想要消除字符串的使用并且不需要花费精力编写常量,请尝试T4MVC。它只会删除在asp.net mvc中编写常量的所有需求。它自动为控制器名称,视图名称,动作名称等生成常量。

+0

我不知道为什么你说这是不正确的,而它工作正常 - 我只是想知道是否有更好的方法来做到这一点。即时消息简单的做法是获取操作名称ControllerReflector.ActionName(Index); 其中索引是另一种操作方法。我认为字符串和常数是相同的 - 在编译期间他们没有太多的控制来发现错误 - 这就是我试图这样做的原因。 – Illuminati 2011-06-07 07:53:05

+0

查看[ActionNameAttribute](http://msdn.microsoft.com/zh-cn/library/system.web.mvc.actionnameattribute.aspx)类。默认的动作调用者使用这个属性。 F.E.如果你的action方法被命名为view,但你得到了[ActionName(“Show”)],路由将使用名称“Show”作为操作名称。你的方法将返回“查看”。 “Show”!=“View”,所以你会遇到问题 – archil 2011-06-07 07:59:37

+0

我没有提到任何有关ActionNameAttribute的内容。该实现纯粹是基于“键入”的东西。 – Illuminati 2011-06-07 08:06:22

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 => c.ShowMeTheMoney(ThreatenWithGun:假的,怒吼:真));

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

相关问题