2011-05-04 124 views
1

我想清理我的代码剃刀语法问题

@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> 
} 
+0

ugh..code汤。使用ViewModel和显示模板来摆脱foreach循环。 – RPM1984 2011-05-04 12:22:41

回答

2

你不能把非结构良好的HTML块内部(如您的<if>),因为剃须刀将不知道在哪里结束该块..

您需要force the HTML to be treated as literal text

@if ((Boolean)c.Row["VF_Visible"]) { 
    @:<td> 
} else { 
    @:<td class="itemUnVisible"> 
} 
0

有一些不成文的规则,指出每次你有你的观点的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如果那里更方便。

0

你可以做这样的事情(未测试)...

<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> 
} 

希望这有助于