繁体   English   中英

强类型的T4MVC Action / ActionLink

[英]Strongly-typed T4MVC Action/ActionLink

我已经使用T4MVC (FYI:v2.6.62)已有一段时间了,并且我一直在慢慢地将代码移到这种工作方式上(减少了对魔术字符串的依赖)。

但是我不得不停下来,因为由于某种原因,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论坛上也提出了问题

更新(10/11/2012) :最近添加的对Model Unbinders的支持(请参阅doc中的 3.1节)有望涵盖很多此类情况。

原始答案:

论坛主题复制我的回复:

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

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

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

如果我已正确理解问题,则以下语法应可让您解决问题。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM