剃刀生产单行文字

时间:2011-05-17 11:25:13

标签: asp.net-mvc-3 razor

我想编写Razor视图助手来生成单行内容:

@helper Format(obj) {
   <text>
       @obj.Title
       @obj.FormatInnerData() (obj.User != null)
       {
          @obj.User.Name
       }
   <text>
}

但我当然得到

Title
Inner Data
User Name

目前我必须做

<text>@obj.Title @obj.FormatInnerData() @(obj.User != null ? obj.User.Name : "")</text>

将单行生成文本输出而不换行,但对于许多属性来说,这可能会变得很长/不可读。

换句话说,如何更方便地使用Razor生成文本内容,而不是标记内容?

UPD:理想情况下会是

   <content>@obj.Title</content>
   <content>@obj.Format()
 @obj.User.Name</content>

即。只有内容标记之间的部分才会进入输出流。当然可能是一个更简单的语法,比如@:而不是&lt; text&gt;。

一个示例用例是生成带有标记的JavaScript字符串内容,或者生成带有许可证详细信息的文本文件,格式为“Key:Name(details)”,每行填充空格以进行分组。

4 个答案:

答案 0 :(得分:1)

因此,如果我理解正确,您想要一种方法来指定多行的视图,而最终输出将是一行中的所有内容?

我认为这不是开箱即用的,但您可以编写自己的Custom RazorViewEngine(从实际的RazorViewEngine派生),它会在返回视图之前修剪所有换行符。

答案 1 :(得分:1)

你可以创建一个像这样的辅助方法

public class MyHelper
{
    public static string JoinedString(string delimiter, params object[] parameters)
    {
        return string.Join(delimiter, parameters);
    }
}

然后在Razor视图中将其称为

MyHelper.JoinedString("", 
         "<text>", 
         @obj.Title, 
         obj.User == null ? "" : obj.User.Name
         "</text>")

请注意,实现是通用的,您可以使用任何分隔符(在本例中为空字符串)。

答案 2 :(得分:0)

你试过吗

@helper Format(obj) {
   <text>
       @( obj.Title + 
          obj.FormatInnerData() + 
         obj.User != null ? obj.User.Name : ""
        )
   <text>
}

答案 3 :(得分:0)

这是部分有用的解决方案:

@helper Format(obj) {
   <text>@(obj.Title
     ) @(obj.FormatInnerData()
     ) @(obj.User != null ? obj.User.Name : "")<text>
}

即。我们在下一行包含代码而不是内容,因此@()中的换行不会写入输出。