2

我正在使用 asp.net MVC 4,在我看来我想做这样的事情

<a href=@NamespaceHere.StaticUtil.TheFunctionIUseAlot("/blah", 1, Viewbag, "link and view specific") class="thing">my link</a>

我不喜欢它。有没有办法可以隐含命名空间?我不能像 global.request.current.viewbag 一样传入 Viewbag 并以某种方式获取它吗?

如果有帮助,我不需要 TheFunctionIUseAlot 是静态的。我只需要在我的所有视图中都可以轻松调用它,并希望我不想通过 viewbag。我通过 viewbag 的原因是因为我需要控制器中的一些东西,我也卡在 viewbag 中。也许我可以把它放在模型中,但我不希望在传递模型而不是 viewbag 的地方出现同样的问题

4

1 回答 1

1

@using NamespaceHere;您可以通过在视图顶部添加或在视图 Web 配置中将其注册为命名空间来使命名空间隐含。像这样的东西:

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <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="NamespaceHere"/>
      </namespaces>
    </pages>
  </system.web.webPages.razor>

如果您为视图使用自定义页面基本类型,则可以访问函数中的视图包。您可以在此处找到有关操作的说明:http: //haacked.com/archive/2011/02/21/changeing-base-type-of-a-razor-view.aspx

在您的情况下,要访问 ViewBag,您需要FunctionThatIUseALot在将 WebViewPage 作为构造函数参数(动态或 ViewDataDictionary)的非静态类中定义。然后,在你的 WebViewPage 的InitHelpers覆盖中,你可以创建你的帮助类,传入this. 这将使您能够访问 WebViewPage 的所有标准属性。

像这样的东西:

public class Utils {
    private WebViewPage page;
    public Utils(WebViewPage page) { this.page = page; }

    public FunctionThatIUseALot(string someParameter) {
        string someViewBagValue = page.ViewBag.SomeViewBagValue;
    }
}

public abstract class CustomWebViewPage : WebViewPage {
  public Utils Utils { get; set; } // Utils is your helper class

  public override void InitHelpers() {
    base.InitHelpers();
    Utils = new Utils(this);
  }
}

以上并不是您需要做的所有事情才能使其工作,其余的您需要阅读文章。但最终结果应该是您可以@Utils.FunctionThatIUseALot("some value")直接在视图中调用。

注意:您需要这样做两次——一次用于标准WebViewPage基类,一次用于WebViewPage<TModel>基类。

于 2013-01-24T03:23:46.560 回答