剃刀语法问题
问题描述:
我想清理我的代码剃刀语法问题
@foreach (System.Data.DataRowView c in (System.Data.DataView)ViewBag.Folders)
{
<tr>
@if ((Boolean)c.Row["VF_Visible"]) {
<td><a href="@Url.Action("Index", "page", new { parent = c.Row["SMF_VF_ID"], granParent = c.Row["VF_Parent_ID"] })">@c.Row["SMF_Name"]</a></td>
} else {
<td class="itemUnVisible"><a href="@Url.Action("Index", "page", new { parent = c.Row["SMF_VF_ID"], granParent = c.Row["VF_Parent_ID"] })">@c.Row["SMF_Name"]</a></td>
}
<td>@Html.ActionLink("Edit", "edit", new { id = c.Row["SMF_VF_ID"] })</td>
<td>@Html.ActionLink("Delete", "Delete", new { id = c.Row["SMF_VF_ID"] })</td>
<td>@Html.ActionLink("Preview", "Preview", new { id = c.Row["SMF_VF_ID"] })</td>
</tr>
}
是内部的,如果被复制的代码。
当我离开的时候,如果只是没有标签和结束标签的td,它会给我一个错误。
@foreach (System.Data.DataRowView c in (System.Data.DataView)ViewBag.Folders)
{
<tr>
@if ((Boolean)c.Row["VF_Visible"]) {
<td>
} else {
<td class="itemUnVisible">
}
<a href="@Url.Action("Index", "page", new { parent = c.Row["SMF_VF_ID"], granParent = c.Row["VF_Parent_ID"] })">@c.Row["SMF_Name"]</a></td>
<td>@Html.ActionLink("Edit", "edit", new { id = c.Row["SMF_VF_ID"] })</td>
<td>@Html.ActionLink("Delete", "Delete", new { id = c.Row["SMF_VF_ID"] })</td>
<td>@Html.ActionLink("Preview", "Preview", new { id = c.Row["SMF_VF_ID"] })</td>
</tr>
}
答
你不能把非结构良好的HTML块内部(如您的<if>
),因为剃须刀将不知道在哪里结束该块..
您需要force the HTML to be treated as literal text:
@if ((Boolean)c.Row["VF_Visible"]) {
@:<td>
} else {
@:<td class="itemUnVisible">
}
答
有一些不成文的规则,指出每次你有你的观点的if
,写一个帮手:
public static HtmlString DetermineCellAction(this HtmlHelper helper,
object visibleColumnValue)
{
// All code below could be much cleaner, this is just an example!
var visible = (bool)visibleColumnValue;
var td = "";
td = (visible) ? "<td if visible>" : "<td if not visible>";
return new HtmlString(td);
}
然后,你可以使用它像:
@foreach (System.Data.DataRowView c in (System.Data.DataView)ViewBag.Folders)
{
<tr>
@Html.DetermineCellAction(c.Row["VF_Visible"])
<!-- mode html here -->
</tr>
}
请注意,该帮手是一个extension method,在这种情况下延伸HtmlHelper
,但你也可以使它成为一个扩展方法DataRowView
如果那里更方便。
答
你可以做这样的事情(未测试)...
<td @if((bool)c.Row["VF_Visible"]) { <text>class="itemUnVisible"</text> } >
或
更新您的视图模型比使用DataRowView的集合清洁。我会创建一个模型类,您可以在控制器中进行所有解析,包括calc可见性,然后将其传递给您的视图。
public class MyViewRecord
{
public int Id {get;set;}
public int ParentId {get;set;}
// etc.
public bool Visible {get;set;}
}
然后,您可以这样做......
@foreach (MyViewRecord item in ViewBag.Folders)
{
<tr>
@if (item.Visible) {
<text><td></text>
} else {
<text><td class="itemUnVisible"></text>
}
<a href="@Url.Action("Index", "page", new { parent = item.ParentId, granParent = item.GrandParentId })">@item.Name</a></td>
<td>@Html.ActionLink("Edit", "edit", new { id = item.Id })</td>
<td>@Html.ActionLink("Delete", "Delete", new { id = item.Id })</td>
<td>@Html.ActionLink("Preview", "Preview", new { id = item.Id })</td>
</tr>
}
希望这有助于
ugh..code汤。使用ViewModel和显示模板来摆脱foreach循环。 – RPM1984 2011-05-04 12:22:41