Синтаксис MVC Razor 3 RC: ошибка или ошибка пользователя? - PullRequest
5 голосов
/ 10 ноября 2010

Я хотел бы думать, что это очевидно, но прежде чем отправлять отчет об ошибке, я хочу знать, что я не делаю это неправильно. Я имею это представление используя ASP.NET MVC3 RC, с Razor:

<div class="miniProfile">
    Joined: @FormatTime(Model.Joined)<br />
    @if (!String.IsNullOrWhiteSpace(Model.Location)) {
        Location: @Model.Location<br />
    }
    Posts: @Model.PostCount<br />
    @Html.ActionLink("Full Profile", "ViewProfile", new { id = Model.UserID }, new { target = "_blank" }) | 
    @Html.ActionLink("Send Private Message", "SendNew", "PrivateMessages", new { id = Model.UserID }) | 
    @Html.ActionLink("Send E-mail", "Send", "Email", new { id = Model.UserID })
    @if (!String.IsNullOrWhiteSpace(Model.Web)) {
        | <a href="@Model.Web" target="_blank">Visit user Web site: @Model.Web</a>
    }
</div>

Он задыхается в "Location" и в трубе в последнем условном сообщении. Если я вставлю некоторые теги , это будет работать так:

<div class="miniProfile">
    Joined: @FormatTime(Model.Joined)<br />
    @if (!String.IsNullOrWhiteSpace(Model.Location)) {
        <text>Location: </text>@Model.Location<br />
    }
    Posts: @Model.PostCount<br />
    @Html.ActionLink("Full Profile", "ViewProfile", new { id = Model.UserID }, new { target = "_blank" }) | 
    @Html.ActionLink("Send Private Message", "SendNew", "PrivateMessages", new { id = Model.UserID }) | 
    @Html.ActionLink("Send E-mail", "Send", "Email", new { id = Model.UserID })
    @if (!String.IsNullOrWhiteSpace(Model.Web)) {
        <text>| </text><a href="@Model.Web" target="_blank">Visit user Web site: @Model.Web</a>
    }
</div>

Несмотря на некоторые пробы и ошибки, я не могу понять, что я делаю, это непослушно. Предложения?

Ответы [ 2 ]

7 голосов
/ 10 ноября 2010

Ваша разметка должна выглядеть следующим образом:

<div class="miniProfile">
  Joined: @FormatTime(Model.Joined)<br />
  @if (!String.IsNullOrWhiteSpace(Model.Location)) {
    <text>Location: @Model.Location<br /></text>
  }
  Posts: @Model.PostCount<br />
  @Html.ActionLink("Full Profile", "ViewProfile", new { id = Model.UserID }, new { target = "_blank" }) |
  @Html.ActionLink("Send Private Message", "SendNew", "PrivateMessages", new { id = Model.UserID }) |
  @Html.ActionLink("Send E-mail", "Send", "Email", new { id = Model.UserID })
  @if (!String.IsNullOrWhiteSpace(Model.Web)) {
    <text>| <a href="@Model.Web" target="_blank">Visit user Web site: @Model.Web</a></text>
  }
</div>

Когда у вас есть оператор @if, все, что после фигурных скобок, все еще считается «кодом», поэтому вам нужно вырваться из него, используятег <text> или синтаксис @:.

Причина такого поведения заключается в том, что часто у вас все равно будет какой-то тег, вложенный в условное выражение, в этом случае все просто работает:

@if(condition) {
    <div>Some content</div>
}

Тег <text> предназначен для тех случаев, когда вы не хотите, чтобы содержимое условия было заключено в какие-либо теги.

2 голосов
/ 10 ноября 2010

Вы не можете иметь просто текстовое содержимое внутри блока кода, движок Razor не может определить, код это или разметка. Вот что есть теги <text>, чтобы убрать неоднозначность. Вы говорите, что теги <text> заставляют его работать (это ответ, больше ничего не нужно делать) или что он все еще не работает с тегами <text> (попробуйте обернуть весь блок if в <text> метка)?

...