簡體   English   中英

如何在razor視圖中使用HTML Helper嵌入的擴展方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM