#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>
}
Т.е. мы переносим код на следующую строку, а не содержимое, таким образом, новые строки внутри @() не записываются для вывода.