我正在学习ASP.Net MVC 5,而且我被迫使用5
。所以我创建了一个扩展方法,现在我想在我的Razor视图中使用它。但它抛出错误 InvalidOprationException错误。
模型
extention method
查看
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
[Display(Name = "Amount Owed")]
public decimal Amount { get; set; }
}
扩展方法
@model IEnumerable<WebApplication3.Models.Student>
@using WebApplication3.Extension
<table class="table" id="studentstable" style="border: 1px solid black; background-color: silver">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Amount)
</th>
<th>
@Html.DisplayNameFor(model => model.Amount)
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@item.Amount.ConvertToDollar() @* this works fine *@
</td>
<td>
@Html.DisplayFor(modelItem => item.Amount.ConvertToDollar()) @*I want somwething like this so that I do not lose the HTML HELPERs*@
</td>
</tr>
}
</table>
错误行:
namespace WebApplication3.Extension
{
public static class Helper
{
public static string ConvertToDollar(this decimal amount)
{
return String.Format("{0:C}", amount);
}
}
}
。我可以简单地使用@Html.DisplayFor(modelItem => item.Amount.ConvertToDollar())
但我想将它嵌入HTMLHELPER中。请指导我。这甚至可能吗?
答案 0 :(得分:1)
TLDR;您可以不使用将传递给@Html.DisplayFor()
的lambda末尾的方法。
您需要以更早地转换数据,使用@Html.Display()
或自行显示数据。
编辑:
@Html.DisplayFor(modelItem => item.Amount.ConvertToDollar())
调用会在我的测试项目中抛出以下错误(我为了演示目的重建了一个类似于你的项目)
InvalidOperationException:模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。 这意味着您无法在此次通话中使用
ConvertToDollar()
。您必须在返回之前转换值。
据我所知,在将lambda传递给@Html.DisplayFor之前,你无法在lambda的末尾调用扩展方法。 您将不得不使用属性来装饰您的类或属性有点像
[Display(Name = "Amount Owed")]
public string AmountAsMoney => $"${this.Amount}";
对不起,我不认为你想做的事情是可能的: - (
根据要求,我在c#中找到了this example对扩展方法的实际有用用法。 至于个人的例子,我不能提供任何代码,但到目前为止,我只使用了扩展方法,以便为其他库中定义的类添加功能,我不想继承或密封。 (这也是OOP的原则,但是,我们仍然可以做到。)