MVC Asp.Net:Razor视图中的动态变量和扩展方法

时间:2013-11-14 14:46:13

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我想在我的剃刀视图中打印一个链接,其中包含项目的id编码。所以我做了一个扩展方法,将int编码为base64字符串。

代码是下一个:

@Html.ActionLink("Delete Item", "Delete", new{ idItem = item.IdItem.EncodeTo64() })

item.IdItem 是一个int,但是当我使用动态变量时, EncodeTo64()方法不会被识别为int变量的扩展方法。它会返回错误:

  

'int'没有'EncodeTo64'的定义

所以,我找到了一个解决方案:投射动态变量,如下所示:

@Html.ActionLink("Delete Item", "Delete", new{ idItem = ((int)item.IdItem).EncodeTo64() })

它有效,但我不喜欢这个解决方案......你知道有什么方法可以避免这种演员并让它发挥作用吗?

谢谢!

修改

这是扩展方法:

public static string EncodeTo64(this int number)
{
    byte[] encoded = System.Text.Encoding.UTF8.GetBytes(number.ToString());
    return Convert.ToBase64String(encoded);
}

1 个答案:

答案 0 :(得分:2)

使用dynamic类型无法完成此操作,因为编译器永远无法推断使用哪种扩展方法。

引擎盖下编译器会将其转为:

myVar.EncodeTo64();

进入这个:

MyStaticClass.EncodeTo64(myVar);

它必须在编译时获得此信息,但由于您使用的是dynamic,因此您明确告诉编译器要等到运行时才能确定要调用哪个调用。

您有三种选择:

  1. 使用强类型模型
  2. 添加为您执行此操作的属性/方法
  3. 与演员一起生活