razor在渲染时抛出异常

时间:2015-05-22 09:41:13

标签: c# asp.net-mvc-4 razor

我有一个剃刀声明:

Base.Hello.get()

这是渲染html表头的代码。因此,当我尝试调用视图时,我得到一个例外(从俄语翻译):

  

运算符只能用于赋值表达式,调用,递增,递减和期望

这是一个剃刀生成的代码部分,其中包含错误:

Child.Hello.get()

这里是一部分名为@{ var renderColumn = new Action<OlapReportColumn>(col => { if (col.IsSpaned) { @<th colspan="@col.Columns.Count">@col.Caption</th>; } }); }

的剃刀代码
    var renderColumn = new Action<OlapReportColumn>(col =>
    {
        if (col.IsSpaned)
        {


            #line default
            #line hidden
item => new System.Web.WebPages.HelperResult(__razor_template_writer => { // ERROR HERE!

BeginContext(__razor_template_writer, "~/Areas/Report/Views/ReportsOlap/ReportTableGenerator.cshtml", 324, 3, true);

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您定义的@<th colspan="@col.Columns.Count">@col.Caption</th>;的行为与C#中的任何其他方法一样。行<th colspan="@col.Columns.Count">@col.Caption</th> 只是输出到输出流;相反,编译器会看到一个不理解的语句,导致错误:

  

CS0201:只能将赋值,调用,递增,递减,等待和新对象表达式用作语句

为了将var renderColumn = new Action<OlapReportColumn>(col => { WriteLiteral("<th colspan=" + col.Columns.Count + ">" + col.Caption + "</th>"); }); 写入输出流,您可以使用WriteLiteral方法:

Func

也许比这更惯用,但是会使用var renderColumn = new Func<OlapReportColumn, object>(col => { return Html.Raw("<th colspan=" + col.Columns.Count + ">" + col.Caption + "</th>"); }); 返回您想要的内容,然后在呼叫网站输出:

@foreach (var h in report.Header)
{
    @(renderColumn(h))
}

然后需要稍微更改一下调用以告诉剃刀您希望输出结果:

Func

更进一步,内部支持Func这种性质,如Phil Haack在this blog中所述。使用此方法,您的通话与上面的通话保持一致,但Func<OlapReportColumn, object> renderColumn2 = @<th colspan="@item.Columns.Count">@item.Caption</th>; 变为:

Func<T, HelperResult>

来自Phil Haack的博客

  

请注意,生成的委托是%span(ng-if="user.streak_count" ng-pluralize count="user.streak_count" when="{'1': #{t('.one_streak_html')}, 'other': #{t('.streak_html')} }") 。此外,@ item参数是一个特殊的魔术参数。

答案 1 :(得分:0)

尝试更改HTML表格标题代码:

@<th colspan="@col.Columns.Count">@col.Caption</th>;

到此:

@:<th colspan="@col.Columns.Count">@col.Caption</th>;

:分隔符后立即插入冒号@并检查是否有效。