微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 有没有办法从控制器访问自定义助手?

我正在构建这个MVC3 Razor ASP.NET应用程序,在该应用程序中我使用了一个继承自它的自定义WebViewPage.所以我的所有视图都使用我的自定义WebViewPage:

public class MyCustomWebViewPage : System.Web.Mvc.WebViewPage
{
    public CustomHelper MyHelper { get; private set; }
         :
}

然后在位于Views文件夹中的web.config中,我指出MyCustomViewPage是我的认基页.

<system.web.webPages.razor>
    <pages pageBaseType="Namespace.MyCustomWebViewPage">
        <namespaces>
             :
        </namespaces>
    </pages>
</system.web.webPages.razor>

到目前为止一切顺利,在View的.cshtml页面上,我可以从剃须刀标记访问我的自定义助手:

@MyHelper.someMethod()

现在,我需要在帮助器上有条件地做一些事情.我尝试在CSHTML的@ {}启动部分设置帮助器属性,但为时已晚,无法将其考虑在内.

所以,我正在考虑在调用的Action方法上执行它,或者通过重写OnActionExecuting()方法.

我遇到的问题是在控制器中我没有找到一种方法来访问我的自定义助手,例如:

public class AnyController : Controller {
    public ActionResult Index() {
        MyHelper.someProperty = true;
    }
}

为了解释它,概念是在一个动作(控制器中的动作代码)中,我想在自定义助手中设置一个属性来启用某些功能.这样就不会在不需要它的视图上呈现.它不同于@section的概念,其中内容在视图中定义,而不是它说“我希望将此功能添加到布局中”,并且布局会输出一些预定义的标记,这些标记将启用该功能并在几个地方视图中可能存在需要“功能支持标记或脚本”的“块”.如果我使用一个部分,那么“常见”脚本会多次出现,这不是我需要的.

话虽如此,如何从控制器中访问基本视图页面中定义的(自定义)帮助器?

解决方法

考虑通过模型传递信息,因为它更符合MVC.您可以使用强类型模型或弱类型ViewBag(示例 – Passing data from controller to view).

期望控制器不知道将使用什么样的页面来呈现视图.它只是说“找到一个具有此名称的视图并呈现此数据(模型)”.根据不同的条件,可能会有不同的视图匹配相同的名称,因此通常您无法从控制器设置视图对象的属性.

编辑:为什么技术上很难:

动作方法调用的生命周期(ActionResult Index(){…})与页面的生命周期(WebViewPage对象)不相交.动作完成执行后创建的WebViewPage对象.因此,如果您真的有兴趣将数据从操作直接推送到视图对象(而不是通过内置机制),您将需要弄清楚如何传递一些代码(可能以委托的形式)来查看创建代码.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐