Rasorテンプレートで、MVCのViewのテンプレートを生成していてちょいハマる。以下のようにまず@に関しては、@@でエスケープ(メールアドレスなんかは何もしなくてもOKだけど)

@@(Html
    .Grid(Model)
    .Build(columns =>
    {

@foreach (var item in Model.Cloumns) {
        columns.Add(model => model.@item.PropertyName).Titled("@item.DisplayName");
}

@if (!String.IsNullOrEmpty(Model.PrimaryId))
{
        columns.Add(model => model.Uid).Titled("").Encoded(false).RenderedAs(model => @@Html.ActionLink("Edit", "Edit", new { id = model.@Model.PrimaryId })).Sortable(false).Filterable(false);
        columns.Add(model => model.Uid).Titled("").Encoded(false).RenderedAs(model => @@Html.ActionLink("Details", "Details", new { id = model.@Model.PrimaryId })).Sortable(false).Filterable(false);
        columns.Add(model => model.Uid).Titled("").Encoded(false).RenderedAs(model => @@Html.ActionLink("Delete", "Delete", new { id = model.@Model.PrimaryId })).Sortable(false).Filterable(false);
}
    })
    .Named("@Model.Clazz")
    .Filterable()
    .Sortable()
    .Pageable(pager =>
    {
        pager.PagesToDisplay = 5;
        pager.InitialPage = 1;
        pager.RowsPerPage = 1;
    })
    .Empty("No data found")
)

ところが、これだと、columns.Add(model => xxx);してる部分がif文内のコードになってしまい解析エラー。なんで解析エラーになるのかわからず、これに気がつくのに1時間ほどハマってしまった。

原因わかれば解決は簡単で、@:で単一行、<text>~</text>で囲めば複数行を静的コンテンツと解釈してくれるのでそれで解決(汗)

@foreach (var item in Model.Cloumns) {
        @:columns.Add(model => model.@item.PropertyName).Titled("@item.DisplayName");
}

@if (!String.IsNullOrEmpty(Model.PrimaryId))
{
        <text>
        columns.Add(model => model.Uid).Titled("").Encoded(false).RenderedAs(model => @@Html.ActionLink("Edit", "Edit", new { id = model.@Model.PrimaryId })).Sortable(false).Filterable(false);
        columns.Add(model => model.Uid).Titled("").Encoded(false).RenderedAs(model => @@Html.ActionLink("Details", "Details", new { id = model.@Model.PrimaryId })).Sortable(false).Filterable(false);
        columns.Add(model => model.Uid).Titled("").Encoded(false).RenderedAs(model => @@Html.ActionLink("Delete", "Delete", new { id = model.@Model.PrimaryId })).Sortable(false).Filterable(false);
        </text>
}

「~」も消えてしまう場合がある。

テンプレート
<script src="~/lib/simplePagination/jquery.simplePagination.js"></script>

出力結果
<script src="/lib/simplePagination/jquery.simplePagination.js"></script>

そんな場合は、チルダ2つでエスケープできた。

テンプレート
<script src="~~/lib/simplePagination/jquery.simplePagination.js"></script>

出力結果
<script src="~/lib/simplePagination/jquery.simplePagination.js"></script>