在RazorEngine中格式化可为空的十进制数

时间:2015-03-05 00:43:28

标签: c# razor razorengine

RazorEngine.dll版本为3.2。

剃刀引擎模板(cshtml文件)中的示例代码:

      @foreach(var row in Model.Trades)
      {            
          <tr>          
             <td>
                @string.Format("{0:N2}",row.Amount)
             </td>
          </tr>
      }     

其中row.Amount在Trades类中定义为: 公共小数?量;

来自RazorEngine的堆栈跟踪是:

> System.ArgumentNullException was caught   HResult=-2147467261  
> Message=Value cannot be null. Parameter name: args   Source=mscorlib  
> ParamName=args   StackTrace:
>        at System.String.Format(String format, Object[] args)
>        at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite
> site, T0 arg0, T1 arg1, T2 arg2)
>        at CompiledRazorTemplates.Dynamic.ccdceaafafffaefee.Execute()
>        at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext
> context) in
> c:\Users\Matthew\Documents\GitHub\RazorEngine\src\Core\RazorEngine.Core\Templating\TemplateBase.cs:line
> 126
>        at RazorEngine.Templating.TemplateService.Run(ITemplate template, DynamicViewBag viewBag) in
> c:\Users\Matthew\Documents\GitHub\RazorEngine\src\Core\RazorEngine.Core\Templating\TemplateService.cs:line
> 608
>        at RazorEngine.Templating.TemplateService.Parse(String razorTemplate, Object model, DynamicViewBag viewBag, String cacheName)
> in
> c:\Users\Matthew\Documents\GitHub\RazorEngine\src\Core\RazorEngine.Core\Templating\TemplateService.cs:line
> 439
>        at RazorEngine.Razor.Parse[T](String razorTemplate, T model, String cacheName) in
> c:\Users\Matthew\Documents\GitHub\RazorEngine\src\Core\RazorEngine.Core\Razor.cs:line
> 276

当Amount为null时发生错误。 这是一种似乎正常的解决方法:

@foreach(var row in Model.Trades)
{            
   <tr>          
      <td>
         @if (row.Amount != null)
         {                
           <text>@string.Format("{0:N4}", row.Amount)</text>
         }
     </td>
  </tr>
}

任何想法,或者至少是一个更好的解决方法? 感谢。

编辑:

下面的解决方法更紧凑:

         <td>
            @(row.Amount == null ? "" : row.Amount.ToString("N4"))
         </td>

有人知道MVC中的Razor是否以相同的方式运行?或者这种行为是否特定于RazorEngine.dll?

1 个答案:

答案 0 :(得分:2)

上面的错误来自String.Format()。有趣的是,正如String.Format()上的文档解释了空参数应该导致空字符串。

无论出于何种原因,Razor选择重载String.Format(format, Object[])来格式化你的字符串。由于您的值为null

我已经创建了small example来解释问题:

int? val = null;

// this one fails:
string template = "Hello @string.Format(\"{0:N4}\", Model.Value)! Welcome to Razor!";
string result = Razor.Parse(template, new { Value = val });

// this (ugly) workaround works:
string template = "Hello @(string.Format(\"{0:N4}{1}\", Model.Value, string.Empty))! Welcome to Razor!";
string result = Razor.Parse(template, new { Value = val });

// this (not so ugly) workaround works as well:
string template = "Hello @(string.Format(\"{0:N4}\", (Object)Model.Value))! Welcome to Razor!";
string result = Razor.Parse(template, new { Value = val });

您的解决方法也可以。

如果这是Razor中的错误或功能,我不知道......

编辑(2):从Moe Sisko

添加了更智能的解决方法

编辑:重写以真正回答这个问题...