ASP.NET MVC:在Razor中自定义Html助手

17 浏览
0 Comments

ASP.NET MVC:在Razor中自定义Html助手

在使用Razor时,我在Html Helpers方面遇到了困难。在MVC 2与Web表单视图引擎一起使用时,这些helpers工作得很好。但在Razor中不行。我在运行时收到的错误是:

Compiler Error Message: CS1502: 最佳重载方法匹配“System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)”有一些无效的参数
Source Error:
Line 1:  @using Wingspan.Web.Mvc;
Line 2:  @Html.IncrementalMenu(MenuBlock.Site)

展开显示详细编译器输出:

d:\...\Views\Shared\MenuTop.cshtml(2,1): 错误 CS1502: 最佳重载方法匹配“System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)”有一些无效的参数
d:\...\Views\Shared\MenuTop.cshtml(2,7): 错误 CS1503: 参数 1: 无法将“void”转换为“System.Web.WebPages.HelperResult”

这告诉我,Razor不喜欢我的帮助程序IncrementalMenu返回void(在MVC 2 Web表单引擎视图中工作正常)。

我在编译时没有收到任何错误,尽管代码行(@Html.IncrementalMenu(...))被红色下划线标记,并显示以下消息:

无法隐式将类型“void”转换为“object”

IncrementalMenu位于Wingspan.Web.Mvc命名空间中。它的签名如下:

public static void IncrementalMenu(this HtmlHelper html, MenuBlock menuBlock)
{
    // 使用HtmlTextWriter从站点地图渲染菜单
}

我不知道哪里出错了...

PS:

MenuBlock参数只是一个标识菜单如何呈现的枚举。不要过分关注此参数,因为它是正确的。

0
0 Comments

ASP.NET MVC中的自定义Html助手在Razor中的使用问题

在ASP.NET MVC中,我们经常需要自定义Html助手来生成特定的HTML代码,以便在视图中使用。然而,在使用Razor作为视图引擎时,我们可能会遇到一些问题。

问题的原因是,我们的Html助手应该返回MvcHtmlString类型的对象,以便与Razor(以及其他不是WebFormsViewEngine的视图引擎)正确地工作。

以下代码是一个自定义的Html助手示例,用于生成

public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
    return MvcHtmlString.Create("<label>" + expression + "</label>");
}

通过返回MvcHtmlString对象,我们确保了生成的HTML代码可以被Razor正确解析和呈现。

对于那些熟悉ASPX视图引擎的开发者来说,这个问题可能会让他们在使用Razor时感到困惑,因为在ASPX中,返回一个简单的字符串也是可以工作的。

感谢这个问题的解决方法,我们现在知道了在Razor中使用自定义Html助手的正确方式。通过返回MvcHtmlString对象,我们确保了生成的HTML代码可以被Razor正确解析和呈现。这为我们提供了更大的灵活性和自定义能力,使我们能够更好地开发ASP.NET MVC应用程序。

通过本文,我们了解到了在使用Razor视图引擎时自定义Html助手的问题以及解决方法。我们发现,为了让Html助手在Razor中正常工作,我们需要返回MvcHtmlString对象。这个问题可能会让那些熟悉ASPX视图引擎的开发者感到困惑,因为在ASPX中,返回一个简单的字符串也是可以工作的。但是,通过返回MvcHtmlString对象,我们可以确保生成的HTML代码可以被Razor正确解析和呈现,从而提供了更大的灵活性和自定义能力。这为我们开发ASP.NET MVC应用程序提供了更好的体验和效果。

0
0 Comments

ASP.NET MVC: Razor中自定义Html Helpers的问题及解决方法

在ASP.NET MVC中,我们可以使用Html Helpers来生成HTML标记,以简化视图中的代码。然而,在使用Razor引擎时,可能会遇到一个问题,即在使用.RenderPartial或.Html.Partial方法时出现错误。

问题的原因是.RenderPartial方法直接将内容呈现到Response中,而不是返回一个字符串。因此,在使用.RenderPartial方法时,需要将它放在一个"Razor代码块"中,如下所示:

@{

Html.RenderPartial(...);

}

为了解决这个问题,Microsoft在ASP.NET MVC中引入了一个新的Html.Partial方法。Html.Partial方法返回一个字符串,因此可以直接使用它,而不需要放在Razor代码块中,如下所示:

.Partial

这样看起来更加简洁和易读。这也符合Razor的设计目标之一,即使代码易于阅读。

这种改进使我感到更加舒适。返回一个字符串是我经常做的事情,我知道它的意思。但是"返回到Response"需要更多的思考。

此外,这也符合一个古老的格言,即微软在第三个版本中将产品做好。例如,Access 97。尽管这个比喻有些沮丧,因为他们在第四个版本中搞砸了,即Access 2000...

通过上述的解决方法,我们可以避免因为使用.RenderPartial或.Html.Partial方法而出现错误,从而节省了时间。

需要注意的是,实际上.RenderPartial方法并不直接将内容呈现到Response中。如果这样做的话,它将会破坏Razor布局(Layouts)的流程。在Razor布局中,首先将页面本身呈现到一个缓冲区中,然后使用该缓冲区来呈现布局(Layout),然后在父级布局(Layout)中使用该缓冲区,直到没有更多的父级布局(Layout)为止。最后,Response才会被实际写出。如果.RenderPartial方法在页面中执行时直接将内容呈现到Response中,它将成为Response中的第一个内容,而不是按照布局的顺序呈现。

因此,.RenderPartial方法实际上是将一个字符串追加到缓冲区中,具有与.Html.Partial方法相同的效果。

通过了解这个问题的原因和解决方法,我们可以更好地使用Razor引擎,并避免在使用.RenderPartial或.Html.Partial方法时出现错误。

0
0 Comments

ASP.NET MVC: 在Razor中自定义Html助手问题的出现的原因以及解决方法

在ASP.NET MVC中,我们可以使用Html助手来生成HTML标记,以简化视图中的代码。然而,在Razor视图引擎中,使用Html助手的方法有两种不同的语法:WebForms语法和Razor语法。这就导致了一些问题。

问题的原因是,WebForms语法中的Html助手方法不需要返回值,而Razor语法中的Html助手方法需要返回值,并将返回值写入HTML流中。

为了解决这个问题,我们可以根据使用的语法选择正确的调用方式。

如果使用的是Razor语法,可以像这样调用Html助手方法:

@{ Html.IncrementalMenu(MenuBlock.Site); }

如果使用的是WebForms语法,可以像这样调用Html助手方法:

<% Html.IncrementalMenu(MenuBlock.Site); %>

另外,如果Html助手方法返回的值不是实现了IHtmlString接口的类型,我们需要使用特定的方式将返回值进行编码,以防止XSS攻击。

如果返回值不是IHtmlString类型,可以使用以下方式进行编码:

<%= Server.HtmlEncode(Html.YourHelper()) %>

ASP.NET MVC中在Razor中自定义Html助手的问题是由于WebForms语法和Razor语法的差异导致的。通过选择正确的调用方式和编码方式,我们可以解决这个问题。

0