【问题标题】:Strongly-typed T4MVC Action/ActionLink强类型 T4MVC Action/ActionLink
【发布时间】:2011-01-23 19:10:28
【问题描述】:

我使用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提出。

【问题讨论】:

    标签: c# asp.net-mvc t4mvc


    【解决方案1】:

    更新(2012 年 10 月 11 日):最近添加的对模型解绑器的支持(请参阅 doc 中的第 3.1 节)有望涵盖很多此类情况。

    原答案:

    forum thread复制我的回复:

    嗯,我认为这还没有出现。也许在大多数情况下,人们有获取对象的 Action 方法,对象的值来自发布的表单数据,而不是通过 URL 传递?在这种情况下,问题不会出现。

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

    其他人是否遇到过这个问题并认为值得解决?

    【讨论】:

    • 嗨,大卫。谢谢回复。我猜想,鉴于在短时间内获得了 5 次支持,它的上升意味着这可能是理想的功能。 :-)
    • 好的,我会把它放到TODO列表中! :)
    • 谢谢!我会发现它特别有用,因为我创建了一些 ActionResult,例如使用 T4MVC 样式操作的 PermanentRedirectResult,而且这种功能会很棒,而不仅仅是在视图中使用!
    • 嗨,大卫。有这方面的更新吗?我真的很想在我使用 T4MVC 的其他项目中看到这一点,但是因为它们使用复杂的类型,我需要手动编写它。
    • 抱歉,这个没有更新。但请注意,这里的设计并不简单。仅获取对象的属性并将它们提升为路由值似乎是任意的。如果还有嵌套属性怎么办?同样的问题将在该级别再次出现。所以归结为尝试将任意对象图序列化为路由值,我不确定是否有普遍接受的“正确”方法。
    【解决方案2】:

    如果我正确理解了这个问题,那么下面的语法应该可以让你解决这个问题。

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

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

    编辑:(回复评论为字符不足)

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

    【讨论】:

    • 恐怕这行不通。它返回路由值,但它们的 url 格式不正确。此外,如果使用这种包装非值类型的方法来修复它,您需要递归地这样做,因为您可能正在使用包含其他复杂类型的复杂类型...
    猜你喜欢
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多