【问题标题】:How to call a method inside a class in view without referencing the class itself?如何在视图中调用类中的方法而不引用类本身?
【发布时间】:2018-05-11 05:45:18
【问题描述】:

我目前有这个代码。

public static class User
{
    public static string GetUserName()
    {
        return Username;
    }
}

我想打电话给@GetUserName(),而不是User.GetUserName();

是否可以在视图 MVC 中调用类内部的方法而不引用类本身?

【问题讨论】:

  • 对 OP 的鼓励:我不知道为什么这个问题吸引了 4 票反对。你已经很清楚你想要达到的目标。这些投票可能表明对该目标的价值存在分歧,并且可以通过解释为什么您认为值得尝试实现这一目标来改善问题,但仅此而已。

标签: c# asp.net-mvc razor


【解决方案1】:

可以使用using static 指令执行此操作,尽管我个人会担心可读性:

@using static User
...
<p>The user name is: @GetUserName()</p>

如果 User 位于不同的命名空间中,则您需要这个:

@using static WhateverNamespace.User

重复一遍,在可读性方面我会非常谨慎地使用它......但它应该工作没有问题。

您也可以添加扩展方法,虽然这不是很整洁。例如,我的测试应用使用 Razor 页面,所以我有一个 IRazorPage 扩展方法:

namespace YourNamespace
{
    public static class PageExtensions
    {
        public static string GetUserName(this IRazorPage view) => User.GetUserName();
    }
}

由于查找扩展方法的方式,您需要:

<p>The user name is: @this.GetUserName()</p>

this. 有点丑,但至少不用记住类名。

【讨论】:

  • 它不必是静态的,您可以直接引用问题本身中指出的命名空间位置和类名。
  • @TravisJ:我不明白你的意思。如果你不使用using static,你不能只写@GetUserName(),你必须写@User.GetUserName(),这是OP想要避免的。我不明白你在暗示什么。
  • 似乎关键是要完全避免命名空间和类名。不过,很公平,我认为这是一种在同一行中不使用类名的情况下调用方法名的可能性。
  • @TravisJ:我假设 OP 希望能够在同一视图中使用多种方法或多次执行此操作 - 单个 using static 指令可以实现这一点。不过,我会用扩展方法编写一个额外的选项。
  • 我正在尝试这个@using static Mynamespace not available 它得到错误静态关键字这个我使用哪个框架 4.5.1
【解决方案2】:

正如您所说,默认情况下仅使用 @GetUserName() 不会起作用。这样做的normal way 是引用类名,然后使用User.GetUserName();。你显然已经意识到了这一点。

但是,这并不意味着其中一部分是不可能的。但这不应该轻率地完成。为了直接调用视图中的方法,您需要将它们添加到 Views 文件夹的 web.config 文件中。不是全局的,特别是视图文件夹中的那个。

在该文件中,您应该找到namespace 元素。您可以在此处添加命名空间引用,以便能够从您的视图中直接调用此方法。

<system.web.webPages.razor>
    ...
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.Optimization" />

        <!-- add the namespace containing static class User here -->
        <add namespace="YourNamespace" />  

      </namespaces>
    </pages>
</system.web.webPages.razor>

完成并重新编译后,您将能够在该 Views 文件夹内的任何视图中使用 User 中的 User 类中的 @User.GetUserName()。如果您使用区域,则需要为每个区域的每个视图文件夹执行此操作。

根据我的经验,这种用途一直在扩展中。不幸的是,它不会完全消除使用@User 的需要,但是它将消除在您访问该类时始终引用命名空间的需要。

【讨论】:

  • 所以添加一个实际上是一个类的命名空间隐式使用using static 而不仅仅是using?很有趣。
  • 我只是出于兴趣而尝试过,但没有成功:“CS0138: A 'using namespace' directive can only be applied to namespaces; 'User' is an type not命名空间。请考虑使用“使用静态”指令”。它显示了生成的代码,其中只有 using YourNamespace.User; 而不是 using static YourNamespace.User;。那是使用常规的 ASP.NET MVC(不是核心)。这肯定适用于某些特定版本吗?
  • @DaisyShipton - 我已将类名作为名称空间的一部分包含在建议中,因此在这方面它可能显示为不起作用。这主要用于我的项目中的扩展,但是,在不实际引用类名的情况下使用方法名似乎是不可能的。
  • YourNamespace.User 不起作用我在 web.config 中声明但仍然没有类声明是不可能的告诉我该怎么做
  • @testedhanes - 它应该只是 web.config 中的 YourNamespace,然后User.GetUserName() 应该在任何关联视图中工作。确保您使用的 web.config 文件是 views 文件夹中的文件,而不是整个项目的文件。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多