代码之家  ›  专栏  ›  技术社区  ›  Dan Atkinson

强类型T4MVC Action/ActionLink

  •  17
  • Dan Atkinson  · 技术社区  · 14 年前

    T4MVC (仅供参考:v2.6.62)很长一段时间以来,我一直在慢慢地将代码转换为这种工作方式(较少依赖于 magic strings ).

    但我不得不停下来,因为出于某种原因,T4MVC无法将对象转换为url,而且似乎只能处理基本类型(int/string/etc)。

    举个例子:

    路线分解:

    /MyController/MyAction/{Number}/{SomeText}
    

    班级:

    namespace MyNamespace
    {
      public class MyClass
      {
        public int Number { get; set; }
        public string SomeText { get; set; }
      }
    }
    

    public class MyController
    {
      public virtual ActionResult MyAction(MyClass myClass)
      {
        return View();
      }
    }
    

    查看:

    <%= Html.Action(
      T4MVC.MyController.Actions.MyAction(
        new MyClass()
        {
          Number = 1,
          SomeText = "ABC"
        }
     ) %>
    

    最终结果是:

    /MyController/MyAction?myClass=MyNamespace.MyClass
    

    而不是

    /MyController/MyAction/1/ABC
    

    还有其他人有这个问题吗?像这样的T4MVC url可用吗?

    ASP.NET Forum .

    2 回复  |  直到 8 年前
        1
  •  17
  •   David Ebbo    12 年前

    更新(10/11/2012) :最近添加的对模型unbinder的支持(请参阅中的第3.1节) doc )希望能涵盖很多这样的案例。

    原始答案:

    从网上复制我的回复 forum thread :

    我认为理论上MVC可以被改变来支持这一点。它只需要将所有对象的顶级属性提升为路由值,而不是尝试使用对象本身(显然,当前行为是假的,是盲目调用ToString()的结果)。

    有没有其他人遇到这种情况,认为值得解决?

        2
  •  4
  •   Dan Atkinson    12 年前

    <%= Html.ActionLink("test", MVC.MyController.MyAction().AddRouteValues(new MyClass() { Number = 5, SomeText = "Hello" })) %>
    

    我认为让语法更好的答案是在每个生成的action result方法中,将每个非值类型参数包装在RouteValueDictionary中

    编辑:(回应评论没有足够的字符)

    啊好吧,我用这个方法重新创建了上面这个简单的例子: /MyController/MyAction/5/Hello 作为url。 我不太确定嵌套的复杂类型在实践中会产生怎样的效果。您可以使用一些递归深入到顶级对象,并对值进行反思以添加它们,但随后会出现一系列新问题,例如如何处理与父属性名称相同的子属性名称。 这似乎是一个需要解决的复杂问题,而且对每个人都适用。

    推荐文章