проблема синтаксиса бритвы - PullRequest
1 голос
/ 04 мая 2011

я хочу очистить свой код

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

код, который находится внутри if, дублируется.
когда я оставляю внутри if только 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>
}

Ответы [ 3 ]

2 голосов
/ 04 мая 2011

Вы не можете поместить некорректно сформированный HTML-код в блок (например, <if>), потому что Razor не будет знать, где заканчивать блок.

Вам необходимо форсироватьHTML должен рассматриваться как буквальный текст :

@if ((Boolean)c.Row["VF_Visible"]) {  
    @:<td>
 } else { 
    @:<td class="itemUnVisible">
}
0 голосов
/ 04 мая 2011

Вы можете сделать что-то вроде (не проверено) ...

<td @if((bool)c.Row["VF_Visible"]) { <text>class="itemUnVisible"</text> } >

или

Обновите вашу ViewModel, чтобы она была чище, чем использование коллекции 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>
}

Надеюсь, это поможет

0 голосов
/ 04 мая 2011

Существует некое неписаное правило, которое гласит, что каждый раз, когда у вас в поле зрения 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>
}

Обратите внимание, что помощником является метод расширения , в данном случае расширяющий HtmlHelper, но вы также можете сделать его методом расширения до DataRowView, если этогде удобнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...