所以,我一直在使用MVC 3,Razor 1和Web.Helpers 1超过一年,但最近转移到MVC 4,Razor 2和Web.Helpers 2.我注意到一些奇怪的事情发生在任何具有HTML属性中的内联代码或Web帮助程序的View中。即,代码在属性之外呈现。
示例1:(MVC 3,Razor 1,Web.Helpers 1)
<li class="@{ Write(0 == RowCount % 2 ? "even" : "odd"); }">
渲染为:
<li class="even">
或
<li class="odd">
示例2:(MVC 3,Razor 1,Web.Helpers 1)
<img alt="@item.PlanNumber" title="@item.PlanNumber" src="@{Html.RenderAction("GetHomeImage", new { street = (string)item.AddrStreet, photo = (string)item.ELEV1, type = (string)item.RecordType, plan = (string)item.PlanNumber, elevation = (string)item.PlanElevation, defaultImage = (string)item.HomeImage });}" border="0" style="padding:2px 2px 2px 2px;" />
渲染为:
<img alt="2473W" title="2473W" src="/Content/_gallery/homes/photos/17411WOODFALLSLANE_S.jpg" border="0" style="padding:2px 2px 2px 2px;" />
当我将网站更新为MVC 4,Razor 2,Web.Helpers 2时,我看到以下内容
示例1呈现为:
<lieven class="">
或
<liodd class="">
示例2呈现为:
<img alt="2473W" title="2473W" /Content/_gallery/homes/photos/17411WOODFALLSLANE_S.jpg src="" border="0" style="padding:2px 2px 2px 2px;" />
我已经能够通过将HTML.RenderAction更改为HTML.Action来解决这个问题,所以我的代码现在是:(MVC 4,Razor 2,Web.Helpers 2)
示例1:
string rowClass = (0 == RowCount % 2) ? "even" : "odd";
<li class="@rowClass">
示例2:
<img src="@Html.Action("GetHomeImage", "FindYourHome", new { street = (string)item.AddrStreet, photo = (string)item.ELEV1, type = (string)item.RecordType, plan = (string)item.PlanNumber, elevation = (string)item.PlanElevation, defaultImage = (string)item.HomeImage })" border="0" style="padding:2px 2px 2px 2px;" alt="@item.PlanNumber" title="@item.PlanNumber" />
正确地渲染了两个例子,但我不确定为什么?
我非常感谢任何可用的信息,这些信息可以帮助我找到我们网站中的任何其他实例,让我对更新到MVC 4,Razor 2和Web.Helpers 2感觉好多了。
答案 0 :(得分:3)
现在无法测试,但试试这个:
<li class="@(0 == RowCount % 2 ? "even" : "odd")">
注意括号而不是括号。
答案 1 :(得分:1)
作为对“为什么”新@(....)
语法有效的回应,请注意MVC4包含对“条件属性”的支持。
在此处查看更多信息:http://www.davidhayden.me/blog/conditional-attributes-in-razor-view-engine-and-asp.net-mvc-4