强类型T4MVC Action / ActionLink

时间:2010-03-04 17:40:29

标签: c# asp.net-mvc t4mvc

我已经使用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这样的网址是否可用?

问题也在ASP.NET Forum提出。

2 个答案:

答案 0 :(得分:17)

更新(2012年10月11日):最近添加的对模型解除绑定器的支持(请参阅doc中的第3.1节)应该可以涵盖很多这些案例。

原始回答:

forum thread

复制我的回复 嗯,我不认为这已经出现了。也许在大多数情况下人们拥有采用对象的Action方法,对象的值来自发布的表单数据,而不是传递给URL?在这种情况下,问题不会出现。

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

让其他人遇到这种情况并认为值得解决吗?

答案 1 :(得分:4)

如果我已正确理解问题,那么以下语法应该允许您解决问题。

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

我认为使语法更好的答案是在每个生成的动作结果方法中将每个非值类型参数包装在RouteValueDictionary中

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

好的我设法使用此方法重新创建上面的简单示例:/MyController/MyAction/5/Hello作为网址。 我不太确定嵌套的复杂类型在实践中会如何发展。您可以使用一些递归来深入到顶级对象并反映值以添加它们,然后您打开一组新问题,例如如何处理与父级相同的子属性名称财产名称。 这似乎是一个复杂的问题,需要以适合每个人的方式解决。 也许某种适配器模式对于将复杂对象转换为路由值最有用。在最简单的情况下,这可能是声明一个扩展方法ToRouteDictionary,它对您的复杂类型起作用,并使用您应该如何工作的知识对其进行转换。只是大声思考,因为我显然不知道你的用例