Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在razor视图中使用嵌入HTML Helper的扩展方法_C#_Asp.net_Asp.net Mvc_Razor_Asp.net Mvc 5 - Fatal编程技术网

C# 如何在razor视图中使用嵌入HTML Helper的扩展方法

C# 如何在razor视图中使用嵌入HTML Helper的扩展方法,c#,asp.net,asp.net-mvc,razor,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Razor,Asp.net Mvc 5,我正在学习ASP.NETMVC5,我一直在使用扩展方法。所以我创建了一个扩展方法,现在我想在Razor视图中使用它。但它抛出了错误invalidoPractionException错误 模型 看法 错误行: @Html.DisplayFormodelItem=>item.Amount.ConvertToDollar。我可以简单地使用@item.Amount.ConvertToDollar,但我想将它嵌入到HTMLHELPER中。请引导我。这可能吗?TLDR;您不能在lambda末尾使用将传递到@

我正在学习ASP.NETMVC5,我一直在使用扩展方法。所以我创建了一个扩展方法,现在我想在Razor视图中使用它。但它抛出了错误invalidoPractionException错误

模型

看法

错误行:

@Html.DisplayFormodelItem=>item.Amount.ConvertToDollar。我可以简单地使用@item.Amount.ConvertToDollar,但我想将它嵌入到HTMLHELPER中。请引导我。这可能吗?

TLDR;您不能在lambda末尾使用将传递到@Html.DisplayFor的方法。 您需要提前转换数据、使用@Html.Display或自己编写并显示数据

编辑: @Html.DisplayFormodelItem=>item.Amount.ConvertToDollar调用在我的测试项目上抛出以下错误。出于演示目的,我重建了一个与您类似的项目

InvalidOperationException:模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式。 这意味着您不能在此调用中使用ConvertToDollar。在返回值之前,必须先转换该值

据我所知,在将lambda传递到@Html.DisplayFor之前,不能在lambda末尾调用扩展方法。 您必须使用属性来装饰类,或者使用类似的属性

    [Display(Name = "Amount Owed")]
    public string AmountAsMoney => $"${this.Amount}";
对不起,我不认为你想做的是可能的:-

根据要求,我发现c语言中的扩展方法确实有用。
就个人而言,我不能提供任何代码,但到目前为止,我只使用了扩展方法,以便将功能添加到另一个库中定义的类中,我不想继承该库,或者将其密封。这与OOP原则背道而驰,但我们仍然可以做到。

将其嵌入HTMLHELPER是什么意思?这个功能已经内置在框架中了。您只需将[DisplayFormatDataFormatString={0:C}]属性添加到Amount属性,并使用@Html.DisplayForm=>item即可。无需重新创建Amount属性wheel@StephenMuecke:谢谢你的投入。但我只是明确地想使用它,这样我就可以知道如何使用扩展方法。这只是一个例子。我并不是有意逻辑地发展它。我只是想知道如何使用扩展方法。并且能够使用Razor代码在UI中显示一些东西。假设我们真的有一个场景需要使用扩展方法。那么如何在razor代码中应用它。我的意思是,我可以写@model.blabla.extensionmethod之类的东西,但我也想利用强类型的东西。我想能够使用HTML帮助程序,并通过应用扩展方法来显示属性。web上有很多关于如何创建HtmlHelper扩展方法的示例。但在这种情况下,创建一个是毫无意义的。研究源代码是一个很好的开始。但是如果不知道你到底想做什么,那是不可能的。好吧,我会再次提出我的疑问。首先忘记我想把金额转换成美元。我知道它可以由框架本身处理。但我只是在学习扩展方法。我明确地想用它。我们只为应用程序中最常用的功能编写扩展方法,而该功能不是由框架提供的。此外,还要删除代码重复。考虑到这一点。假设我们没有在金额上转换美元符号的功能。所以,我编写了一个示例扩展方法,它将amount附加美元符号,迄今为止效果良好。但我的问题是如何从htmlhelper调用扩展方法。Supose我想在1000个位置将金额转换成美元为什么我需要写这样的东西`@item.amount.ConvertToDollar`我想使用inbuild htmlhelper并调用扩展方法。类似@Html.DisplayFormodelItem=>item.Amount.ConvertToDollarSo这样的东西。基本上,我正在尝试学习扩展方法以及如何在Razor代码中调用它们。
@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);
        }
    }
}
    [Display(Name = "Amount Owed")]
    public string AmountAsMoney => $"${this.Amount}";