asp.net mvc - 使用Razor声明性视图中的MVC HtmlHelper扩展

我试图在我的App_Code文件夹中为MVC 3 RTM项目创建一个Razor声明性帮助器。

我遇到的问题是MVC HtmlHelper扩展(如ActionLink)不可用。 这是因为编译好的助手派生自System.Web.WebPages.HelperPage,虽然它暴露了Html属性,但其类型为System.Web.WebPages.HtmlHelper而不是System.Web.Mvc.HtmlHelper。

我得到的一种错误的例子是:

'System.Web.Mvc.HtmlHelper'没有   包含'ActionLink'的定义   没有扩展方法'ActionLink'   接受第一个类型的参数   'System.Web.Mvc.HtmlHelper'可以   发现(你错过了使用   指令或程序集引用?)

我唯一的解决方案是创建自己的HelperPage并覆盖Html属性:

using System.Web.WebPages;

public class HelperPage : System.Web.WebPages.HelperPage

{

// Workaround - exposes the MVC HtmlHelper instead of the normal helper

public static new HtmlHelper Html

{

get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }

}

}

然后我必须在每个助手的顶部写下面的内容:

@inherits FunnelWeb.Web.App_Code.HelperPage

@using System.Web.Mvc

@using System.Web.Mvc.Html

@helper DoSomething()

{

@Html.ActionLink("Index", "Home")

}

它是否意味着在MVC 3中这么难,或者我做错了什么?

9个解决方案

42 votes

看一看Marcind对这个问题的回答。 您遇到的是将声明性视图放在App_Code文件夹中的限制。

将助手放在App_Code中可以正常工作   但有一定的局限性   影响某些MVC场景(for   示例:无法访问标准MVC  HTML。佣工)

Omar answered 2019-06-08T01:22:47Z

38 votes

我为WebPages助手创建了一个扩展方法,以便我可以访问页面助手。

public static HtmlHelper GetPageHelper(this System.Web.WebPages.Html.HtmlHelper html)

{

return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html;

}

Jake Hoffner answered 2019-06-08T01:23:12Z

11 votes

奥马尔在这里得到了正确的答案,但我想补充一些东西(请随意将奥马尔的回答标记为答案)。

我们在v1中意识到了这一点并且无法在产品中得到很好的解决方案,但David Ebbo(ASP.Net团队的架构师)发布了一个Visual Studio代码生成器示例,它基本上是第一次探索 我们正在寻求使这项工作正常运行的想法:[http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries.aspx]

尝试一下,看看你的想法! 让大卫知道你是否通过在他的博客上发表评论。

Andrew Stanton-Nurse answered 2019-06-08T01:23:53Z

9 votes

与@Jakes答案类似:

public static class MvcIntrinsics {

public static System.Web.Mvc.HtmlHelper Html {

get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html; }

}

public static System.Web.Mvc.AjaxHelper Ajax {

get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Ajax; }

}

public static System.Web.Mvc.UrlHelper Url {

get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Url; }

}

}

用法:

@MvcIntrinsics.Html.Raw("test")

来源:Dino Esposito - 编程Microsoft ASP.NET MVC

Greg Gum answered 2019-06-08T01:24:27Z

7 votes

替代解决方案:

在你的razor-helper文件上添加它:

@functions {

public static System.Web.Mvc.HtmlHelper HHtml = ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html;

}

然后像这样称呼它:

@HHtml.ActionLink("actionname")

Alex answered 2019-06-08T01:25:01Z

4 votes

为了搜索者的利益,我在创建MVC视图作为类库的一部分(用于组件重用)时遇到了同样的错误。 上面部分提到的解决方案是在.cshtml文件的顶部添加以下using语句:

@using System.Web.Mvc

@using System.Web.Mvc.Html

无需进一步的工作。

HockeyJ answered 2019-06-08T01:25:35Z

3 votes

我的方法是简单地将页面作为参数传递给辅助方法。 所以在你的例子中它将是:

@helper DoSomething(WebViewPage page)

{

@page.Html.ActionLink("Index", "Home")

}

然后在您需要的Razor视图中调用它,如下所示:

@YourHelperFilename.DoSomething(this)

立即执行此操作可以访问您通常拥有的页面属性,如ViewData或Url(以及HtmlHelper扩展名)。

作为额外的好处(如果您需要),您还可以访问实例属性,例如页面ViewData。

Dejan answered 2019-06-08T01:26:22Z

0 votes

我知道MVC 3存在一些智能感知问题。我认为如果你在web.config中设置了命名空间,帮助程序仍然可以工作。

MVC 3 RTM刚刚发布,你使用这个还是测试版?

Lee Smith answered 2019-06-08T01:26:55Z

0 votes

看起来ASP.NET MVC已经在VS 2013中解决了这个问题。请参阅这篇文章[http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this-htmlhelper-HT]

Omar answered 2019-06-08T01:27:22Z

mvc html的扩展,asp.net mvc - 使用Razor声明性视图中的MVC HtmlHelper扩展相关推荐

  1. php 身份认证 claim,asp.net core cookie身份认证view视图中读取/读取User.Claims中的值实例...

    假设claim如下,q为查询出来的用户表结果集 var claims = new List(){ new Claim("UserId", q.Id.ToString()), new ...

  2. [ASP.NET MVC]通过对HtmlHelper扩展简化“列表控件”的绑定

    在众多表单元素中,有一类<select>元素用于绑定一组预定义列表.传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListControl,我们经常用到DropDo ...

  3. 关于ASP.NET MVC P5中CheckBox的HtmlHelper方法的bug。

    在ASP.NET MVC P5中,当你使用这样的方法输出CheckBox:<%=Html.CheckBox("checkTest")%>,在浏览器上除了你期望看到的代码 ...

  4. 007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】

    索引: 目录索引 Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Ch ...

  5. html里面的view怎么修改,asp.net mvc 3-在局部视图中修改MVC 3 ViewBag不会保留到_Layout.cshtml...

    asp.net mvc 3-在局部视图中修改MVC 3 ViewBag不会保留到_Layout.cshtml 我在Razor视图引擎中使用了MVC 3. 我想在局部视图的ViewBag中设置一些值,并 ...

  6. mvc jquery ajax方法,asp.net mvc-如何在jQuery $ .ajax()中将模型发送请求到MVC控制器方法...

    asp.net mvc-如何在jQuery $ .ajax()中将模型发送请求到MVC控制器方法 在使用以下代码进行自动刷新时,我假设执行发布后,模型将自动发送给控制器: $.ajax({ url: ...

  7. 如何在FineUIMvc(ASP.NET MVC)视图中绑定多个模型?

    起因 这是知识星球内的一个网友提出的,按理说ASP.NET MVC中一个视图只能绑定一个模型(Model),在视图顶部标识如下: @model IEnumerable<FineUICore.Ex ...

  8. 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC

    七天学会ASP.NET MVC (一)--深入理解ASP.NET MVC 系列文章 七天学会ASP.NET MVC (一)--深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)-- ...

  9. asp.net core mvc权限控制:在视图中控制操作权限

    在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式 ...

  10. 在 ASP.NET Core 中安装 MVC

    目录 本文出自<从零开始学 ASP.NET CORE MVC>目录  视频课程效果更佳:从零开始学 Asp.Net Core MVC 在ASP.NET Core 中安装 MVC 在本视频中 ...

最新文章

  1. MSCKF-Based Visual-Wheel Odometry 轮速视觉融合里程计
  2. 目标层准则层MATLAB,层次分析法-MATLAB
  3. Python中的高效的集合操作
  4. 2020 年终总结:变化 积累
  5. 使用git建立本地仓储管理代码【转】
  6. 【信息系统项目管理师】第12章-项目采购管理 知识点详细整理
  7. 【Endnote】EndnoteX9快速上手教程
  8. 清华ACL'22 | 一文读懂刘知远所在实验室18篇论文详情
  9. D - 迷宫游戏 (最短路径)
  10. 汽车电子技术——CAN总线系统
  11. floyd与传递闭包
  12. 基于fabricjs实现钢笔工具
  13. 关于徐晓东,传统武术,以及太极拳
  14. APICloud可视化开发新手图文教程
  15. 用计算机对视频进行剪裁和编辑,爱剪辑怎么裁剪视频片段?
  16. 一种LCD屏闪问题的调试
  17. 记深信服2018秋季校园招聘--技术服务工程师
  18. 计算机私密相册安全吗,一张照片竟能泄露这么多隐私?这个功能不可不知
  19. 下载上市公司财报并可视化某科目
  20. 计算机显示器是输入,如果计算机显示器未显示视频输入怎么办

热门文章

  1. redis安装部署(1)
  2. Python::OS 模块简介
  3. C51寄存器详解(Reg51.h)
  4. 一个简单的优酷视频链接探测与分享功能
  5. ASP.NET 2.0中的页面输出缓存
  6. html中div弹出显示
  7. linux安装snmp显示乱码_Linux安装X Window服务——远程显示GUI
  8. 腾讯云服务器连接失败,启动报错:A start job is running for /etc/rc.d/rc.local Compatibility
  9. Yii Framework2.0开发教程(1)配置环境及第一个应用HelloWorld
  10. vue cli3.0 解决跨域问题和axios等问题,配合Django