asp.net-mvc-3 – Razor Func与MvcHtmlString混合使用
我不是Razor语法的大师,而是尝试使用流畅的àlàTelerik的GUI组件来构建通用库.
我有以下几件(大约): public static MyBox Box(this HtmlHelper helper) { return new MyBox(helper.ViewContext); } 和: /// <summary> /// http://geekswithblogs.net/shaunxu/archive/2010/04/10/lt-gt-htmlencode-ihtmlstring-and-mvchtmlstring.aspx /// </summary> public class MyBox : IHtmlString { private readonly ViewContext _viewContext; private string _content; private string _title; public MyBox(ViewContext viewViewContext) { _viewContext = viewViewContext; } /// <summary> /// See: http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx /// </summary> /// <param name="value"></param> /// <returns></returns> public MyBox Content(Func<object,object> value) { _content = value.DynamicInvoke(_viewContext).ToString(); return this; } /// <summary> /// See: http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx /// </summary> /// <param name="values"></param> /// <returns></returns> public MyBox Content(params Func<object,object>[] values) { foreach (var value in values) { _content += value.DynamicInvoke(_viewContext).ToString(); } return this; } public MyBox Content(MvcHtmlString content) { _content = content.ToString(); return this; } public MyBox Title(string title) { _title = title; return this; } public string ToHtmlString() { using (var stringWriter = new StringWriter()) { WriteHtml((TextWriter)stringWriter); return stringWriter.ToString(); } } public void Render() { using (var writer = new HtmlTextWriter(_viewContext.Writer)) WriteHtml(writer); } protected virtual void WriteHtml(TextWriter writer) { writer.WriteLine("<!-- START BOX -->"); writer.WriteLine("<h1>" + _title + "</h1>)); writer.WriteLine(_content); writer.WriteLine("<!-- END BOX -->"); } } 我还有一组返回MvcHtmlString的Html扩展方法.一个例子是(简化): public static class GuiElementExtensions { private const string FieldContainerHeadingTemplate = @" <tr><th style=""text-align:left"" colspan=""2"">{0}</th></tr> "; public static MvcHtmlString GuiFieldContainerHeading(this HtmlHelper helper,string text) { return new MvcHtmlString(String.Format(FieldContainerHeadingTemplate,text)); } } 然后,在我的.cshtml文件中,我执行以下操作: @using (Html.BeginForm()) { @(Html.Gui() .Box() .Title("Hello World!") .Content( @<h1>Hello World! This is the cool Gui.Box</h1> ) ) } 哪个调用公共MyBox内容(Func< object,object> value),并且有效. @using (Html.BeginForm()) { @(Html.Gui() .Box() .Title("Hello World!") .Content( Html.GuiFieldContainerHeading("SubHeading 1") ) ) } 它愉快地调用公共MyBox内容(MvcHtmlString内容)并按预期工作. 但是,当我尝试执行以下操作时,我无法理解Razor编译器引擎的工作原理.如何让它返回总和 > @< h1> Hello World!这是Gui().Box??()< / h1> (这是一个Func) 作为一个对象(无论是Func,MvcHtmlString,无论是什么,还是对象列表?我想在参数列表中将通用Razor语法写入MyBox类中的Content函数,如下所示: @using (Html.BeginForm()) { @(Html.Gui() .Box() .Title("Hello World!") .Content( @<h1>Hello World! This is Gui().Box()</h1> Html.GuiFieldContainerHeading("SubHeading 1") Html.TextBoxFor(model => model.Name) @<h2>Hello there!</h2> ) ) } 我是在正确的轨道上,还是有一种更简单的方式来做我想做的事情?我想在一个常见的DLL中收集我们系统中的所有“常见gui元素”,因此我的组织中的每个开发人员都不需要重新发明每个项目的轮子. 任何帮助赞赏. 好的,下一个问题: 我将Box一般化为一个Container,并创建了两个子类,Box和HighlightArea.但是,使用以下代码,Razor编译器会向我发送消息
代码不起作用,是: @(Html.Gui() .Box() .Title("BoxTitle") .Content(@<text> <h1>Hello World! This is the box content</h1> @Html.GuiFieldContainerHeading("This is the heading") @(Html.Gui().HighlightArea() .Content( @Html.ValidationSummary() @<h1>Jalla</h1> ) ) </text> ) 我们有解决方法吗?或者我的方法不可行? 解决方法
您可以使用< text>标记将所有内容组合成一个参数.
@using (Html.BeginForm()) { @(Html.Gui() .Box() .Title("Hello World!") .Content( @<text> <h1>Hello World! This is Gui.Box</h1> @Html.GuiFieldContainerHeading("SubHeading 1") @Html.TextBoxFor(model => model.Name) <h2>Hello there!</h2> </text> ) ) } 我想你的例子并没有真正起作用.如果我没弄错的话,你可以让它像这样工作: @<h1>Hello World! This is Gui.Box</h1> + Html.GuiFieldContainerHeading("SubHeading 1") + Html.TextBoxFor(model => model.Name) + @<h2>Hello there!</h2> 但< text>标签似乎更容易. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 用于asp.net的rails样式数据库迁移?
- asp.net-mvc-3 – 绑定到视图模型的MVC3 Razor – TextBoxF
- asp.net – 我应该从UI层返回到业务层?
- asp.net-mvc – ASP.NET MVC – 保持控制器薄(太多的动作方
- asp.net-mvc – 命名空间’System.Web.Mvc’中不存在’Ajax
- ASP.NET MVC Route的几种配置方法
- asp.net – 在网站项目中使用SignalR
- 在我的asp.net-mvc页面中,为什么没有选择正确的下拉列表?
- asp.net – 自上一步以来,进程或线程已更改
- 是否可以在OSX上使用Razor作为独立库(没有任何asp.net业务)
- 如何创建自定义授权属性以检查Asp.Net Core中的角
- 展望asp.net core Blazor项目c#编译为原生WebAss
- asp.net-identity – 多租户身份服务器openid身份
- 调试 ASP.NET Core 2.0 源代码
- asp.net – 如何使用JwtSecurityTokenHandler和J
- 【Asp.Net MVC+EF+三层架构】详解(一)初见
- asp.net-mvc – MVC验证消息 – 本地化?
- asp.net web大文件上传带进度条实例代码
- asp.net – 使用.NET FormsAuthentication和持久
- asp.net-mvc – 当model是父模型上的属性且为nul