[英]How to use extension methods embedded with HTML Helper in razor view
我正在學習ASP.Net MVC 5,並且extention method
使用extention method
。 因此,我創建了一個擴展方法,現在我想在Razor視圖中使用它。 但這會引發錯誤InvalidOprationException Error 。
模型
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())
。 我可以簡單地使用@item.Amount.ConvertToDollar()
但我想將其嵌入HTMLHELPER中。 請指導我。 這有可能嗎?
TLDR; 您不能在lambda的末尾使用將傳遞給@Html.DisplayFor()
。 您需要更早地轉換數據,使用@Html.Display()
或自己編寫顯示數據。
編輯: @Html.DisplayFor(modelItem => item.Amount.ConvertToDollar())
調用在我的測試項目上拋出了以下錯誤(出於演示目的,我重建了一個與您相似的項目)
InvalidOperationException:模板只能與字段訪問,屬性訪問,一維數組索引或單參數自定義索引器表達式一起使用。 這意味着您不能在此調用中使用
ConvertToDollar()
。 您必須先轉換值,然后再返回。
據我所知,您不能在傳遞給@ Html.DisplayFor之前在lambda的末尾調用擴展方法。 您將不得不使用Attribute來裝飾類或使用類似於
[Display(Name = "Amount Owed")]
public string AmountAsMoney => $"${this.Amount}";
對不起,我認為您嘗試做的事情是不可能的:-(
根據要求,我發現了此示例在c#中真正有用的擴展方法用法。 對於個人示例,我無法提供任何代碼,但到目前為止,我僅使用擴展方法來向我不希望繼承的其他庫中定義的類添加功能,或者將其密封。 (這再次遵循OOP原則,但我們仍然可以做到。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.