Razor для создания однострочного текста

#asp.net-mvc-3 #razor

#asp.net-mvc-3 #razor

Вопрос:

Я хочу написать Razor view helper для создания однострочного содержимого:

 @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>
  

т.е. в поток вывода попадают только части между тегами содержимого. Конечно, может быть более простой синтаксис, например @: вместо <text> .

Примером использования может быть создание содержимого строки JavaScript с разметкой внутри или создание текстовых файлов с деталями лицензии в формате «Ключ: Имя (подробности)» в каждой строке, дополненных пробелами для группировки.

Комментарии:

1. В обоих ваших примерах на самом деле не имеет значения, используете вы <text> тег или нет. Этот тег предназначен в первую очередь для перехода от кода к разметке, где в противном случае это было бы неоднозначно (для синтаксического анализатора).

2. если вы так заботитесь о форматировании, почему бы просто не использовать пользовательский html helper вместо razor helper?

3. Поскольку это становится очень некрасивым, смотрите «В настоящее время я должен сделать» в вопросе.

Ответ №1:

Итак, если я вас правильно понял, вы хотели бы способ указывать свои представления в нескольких строках, в то время как конечный результат был бы всем в одной строке?

Я не думаю, что это возможно «из коробки», но вы могли бы написать свой собственный пользовательский RazorViewEngine (производный от фактического RazorViewEngine), который удаляет все новые строки перед возвратом представления.

Комментарии:

1. Я не хочу, чтобы все представления были в одной строке. Я хочу управлять этим из представления — этот фрагмент в виде одной строки, здесь я хочу новые строки. Т.Е. в качестве примера я хочу создавать текстовые файлы, а не HTML-разметку. Я мог бы сделать @Html. MyHelper (obj). toString().Replace(» n», «»») — но это некрасиво, и все равно я не контролирую изнутри помощника, куда вставлять n, а куда нет.

2. @queen3: вы могли бы внедрить свой собственный тег, например, <singleline> в свой пользовательский viewengine, точно так же, как у razorengine есть <text> тег. Тогда было бы выполнено только обрезание новых строк из этих однострочных блоков.

3. @queen: Обратите внимание, что это было бы сделано в пользовательском RazorEngineHost, а не в RazorViewEngine.

Ответ №2:

Вы могли бы создать вспомогательный метод, подобный этому

 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>")
  

Обратите внимание, что реализация является универсальной, и вы можете использовать любой разделитель (в данном случае пустую строку).

Ответ №3:

Вы пробовали

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

Комментарии:

1. В реальном мире это часто «<div>» obj. Заголовок «</div><div class=’cls’>» obj …. — слишком уродливый и даже менее читаемый, чем обычная, но однострочная разметка.

2. @queen3: очевидно, вы все еще используете это для генерации html? Тогда я не понимаю, зачем вам понадобилось что-то в одной строке. В любом случае, это не имеет значения, если впоследствии он будет отображен в браузере.

3. Например, для отображения этого в строку JavaScript. Или, может быть, я хочу сгенерировать экранированную HTML-разметку для примеров для отображения на странице, и она должна быть отформатирована, потому что я создаю PDF из этого HTML позже.

Ответ №4:

Вот частично полезное решение:

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

Т.е. мы переносим код на следующую строку, а не содержимое, таким образом, новые строки внутри @() не записываются для вывода.