如何在剃刀视图中使用嵌入了HTML Helper的扩展方法

时间:2017-08-04 20:58:24

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

我正在学习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中。请指导我。这甚至可能吗?

1 个答案:

答案 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的原则,但是,我们仍然可以做到。)