在ASP.NET MVC中使用Razor创建可重用的HTML视图组件
发布时间:2020-12-15 18:32:23 所属栏目:asp.Net 来源:网络整理
导读:我有一个Razor帮助函数,创建一个可重用的HTML面板,可以帮助我一遍又一遍地编写相同的HTML。 @helper DefaultPanel(string panelTitle) { div class="panel" div class="panel-logo"img src="/logo.png"/div div class=panel-inner" p class="panel-title"@
我有一个Razor帮助函数,创建一个可重用的HTML面板,可以帮助我一遍又一遍地编写相同的HTML。
@helper DefaultPanel(string panelTitle) { <div class="panel"> <div class="panel-logo"><img src="/logo.png"></div> <div class=panel-inner"> <p class="panel-title">@panelTitle</p> <div class="panel-content"> /* Can I pass content to be rendered in here here? */ </div> </div> </div> </div> } 我想知道,是否可以重新使用这个帮助程序来填充.panel内容与更多的HTML,以进一步的灵活性和代码重用 – 类似于下面的内容: @LayoutHelpers.DefaultPanel("Welcome back") { <div class="panel-content-inner"> <p>Welcome back,please select from the following options</p> <a href="#">Profile</a> <a href="#">My Defails</a> </div> } 虽然使用.NET MVC我注意到Html.BeginForm()在Html.BeginForm声明中的@using语句中包装代码时也是类似的,像这样: @using (Html.BeginForm("Index","Login",FormMethod.Post)) { <div>This content gets rendered within the <form></form> markup.</div> } 但是可以使用@helper方法吗?如果没有,是否可以创建一个HtmlHelper扩展来做类似的事情,Html.BeginForm()方法的方式? 你可以使用@section语法来做一个非常相似的事情,如here所示 这似乎是能够做到真正有用的东西,奇怪的是在组件级别上没有简单的方法来做到这一点。 解决方法
有两种方法来实现所需的功能。
@helper 创建@helper,接受你需要的任何参数加一个函数(单个对象参数,返回对象): @helper DefaultPanel(string panelTitle,Func<object,object> content) { <div class="panel"> <div class="panel-logo"> <img src="/logo.png" /> </div> <div class="panel-inner"> <p class="panel-title">@panelTitle</p> <div class="panel-content"> @content(null) </div> </div> </div> } 用法: @DefaultPanel("title",@<div class="panel-content-inner"> <p>Welcome back,please select from the following options</p> <a href="#">Profile</a> <a href="#">My Defails</a> </div> ) 您的功能也可以接受参数,例如here。 2. HtmlHelper扩展方法 在项目的任何地方添加以下代码: namespace System.Web.Mvc { public static class HtmlHelperExtensions { public static HtmlDefaultPanel DefaultPanel(this HtmlHelper html,string title) { html.ViewContext.Writer.Write( "<div class="panel">" + "<div class="panel-inner">" + "<p class="panel-title">" + title + "</p>" + "<div class="panel-content">" ); return new HtmlDefaultPanel(html.ViewContext); } } public class HtmlDefaultPanel : IDisposable { private readonly ViewContext _viewContext; public HtmlDefaultPanel(ViewContext viewContext) { _viewContext = viewContext; } public void Dispose() { _viewContext.Writer.Write( "</div>" + "</div>" + "</div>" ); } } } 用法: @using (Html.DefaultPanel("title2")) { <div class="panel-content-inner"> <p>Welcome back,please select from the following options</p> <a href="#">Profile</a> <a href="#">My Defails</a> </div> } 扩展方法直接写入上下文。诀窍是返回一次性对象,其中Dispose方法将在使用结束时执行。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net CustomValidator从不触发OnServerValidate
- asp.net-mvc – Html.ActionLink给出错误:无法解决操作
- 如何为ASP.NET Core Angular应用程序设置默认端口
- asp.net – 在Page_Load之前处理事件
- asp.net – IIS 7如何使用数据库中的用户帐户映射客户端证书
- ASP.NET MVC与Webforms与HTTP处理程序(.ashx) – 哪个是最轻
- odata – 与Breezejs发布批量请求
- asp.net – Windows Azure – NetworkInformationException
- asp.net-mvc – 我的应用程序中没有加载图像,css和js文件
- asp.net-mvc – Asp.Net mvc session与cache
推荐文章
站长推荐
- asp.net-mvc-3 – 用Response调用的Ajax.BeginFo
- asp.net – Turn by Turn游戏:使用SignalR或Sig
- 单元测试 – ASP .NET Web API控制器测试
- asp.net-mvc-3 – MVC 3传递实体作为接口
- asp.net-web-api – web api – asp.net身份令牌
- 为什么ASP.NET自动生成的.designer代码的类型不正
- asp.net-mvc中的Reportviewer数据源
- asp.net – 如何让Sitecore(和我的浏览器)使用Pr
- Parallel线程安全问题
- asp.net-mvc-4 – ASP.NET Web API架构建议/反馈
热点阅读