asp.net 我怎样才能在Blazor拥有New Line

yws3nbqq  于 2023-02-26  发布在  .NET
关注(0)|答案(8)|浏览(185)

我正在尝试创建一个换行符,并且已经在其他论坛上看过了,有些论坛使用'\n','\r '或Environment.NewLine,但我个人没有任何效果。我给你代码和结果:
第一章:

string n1 = SomeText;
string n2 = AnotherText;
string beforeStr = n1 + Environment.NewLine + n2;

二:

string n1 = SomeText;
string n2 = AnotherText;
string beforeStr = n1 + '\r' + n2;

第三章:

string n1 = SomeText;
string n2 = AnotherText;
string beforeStr = n1 + '\n' + n2;

总是相同的结果:

SomeText AnotherText
4smxwvx5

4smxwvx51#

MarkupString解决方案将吞下/解释所有未转义的html字符。这可能导致使用动态用户输入字符串的XSS攻击。

这里的方法是先进行html-escape,然后将所有换行符替换为

@using System.Web
@using System.Text.RegularExpressions;

<div>
  @((MarkupString)Regex.Replace(
    HttpUtility.HtmlEncode(@multilineString), "\r?\n|\r", "<br />"))
</div>

正则表达式\r?\n|\r将替换\r (old Mac)\r\n (Windows)\n (Unix)
这也可以作为组件实现。

  • 多线字符串剃须刀 *
@using System.Web
@using System.Text.RegularExpressions;

@((MarkupString)Regex.Replace(HttpUtility.HtmlEncode(@Value), "\r?\n|\r", "<br />"))

@code {
    [Parameter]
    public string Value { get; set; } = default!;
}

现在,它更易于与<MultilineString Value=@yourInput />配合使用

xmq68pz9

xmq68pz92#

我能想到的唯一方法是使用Razor模板。\r\n、Envirnoment.Newline和其他任何东西都不能使编译器改变。
下面是使用Razor模板的工作解决方案:

<p>@resultString</p>

@code {
    RenderFragment resultString =  @<p>Series not found <br />Error message</p>;
                          
}

更新:您还可以使用此:

MarkupString  resultString = (MarkupString) $"Series not found <br />Error message";

更新2:根据文件:

渲染原始HTMLBlazor通常使用DOM文本节点渲染字符串,这意味着它们可能包含的任何标记都将被忽略,并被视为文本。这个新特性允许您渲染特殊的MarkupString值,这些值将被解析为HTML或SVG,然后插入DOM。

警告:呈现从任何不可信来源构造的原始HTML是一个重大的安全风险!
使用MarkupString类型添加静态HTML内容块。

@((MarkupString)myMarkup)

@functions {
    string myMarkup = "<p class='markup'>This is a <em>markup string</em>.</p>";
}
z3yyvxxp

z3yyvxxp3#

浏览器中的文档结构将采用HTML格式,因此您需要使用HTML标记(特别是<br />)来控制文档流。

string beforeStr = n1 + '<br />' + n2;

正如Panagiotis Kanavos所提到的,并且可能因为使用Blazor,所以在.razor组件中可能会出现如下内容:

<p>
    @n1 <br /> @n2
</p>
2eafrhcq

2eafrhcq4#

我创建了一个简单的组件LineBreaksToBRs,它避免了MarkupString的风险。

@if (lines != null)
    for (int i = 0; i < lines.Length; i++)
    {
        @lines[i];
        <br />
    }

@code {
    string[] lines;

    [Parameter]
    public string InputString { get; set; }

    protected override void OnParametersSet()
    {
        lines = InputString?.Split('\n');
    }
}

和用法

...
<div class="field">
    <span>My Field</span>
    <span>
        <LineBreaksToBRs InputString=@Record.MyField />
    </span>
</div>
...
inkz8wg9

inkz8wg95#

这就是我要做的。在我的剃刀档案里,我加了一句:

@foreach (var item in References)
{
    <br />
    @item
}

在我的C#类中,我添加了以下内容:

protected List<string> References { get; set; } = new List<string>();

只要用你需要的每一行文本填写参考,它就会工作得很好。我发现了很多其他的解决方案,但这对我来说是最简单的。

abithluo

abithluo6#

这对我很有效

@foreach (var sub in beforeStr.Split('\n'))
{
    @sub <br/>
}

@code{
string n1 = SomeText;
string n2 = AnotherText;
string beforeStr = n1 + '\n' + n2;
}
am46iovg

am46iovg7#

我不太擅长html,这是我用来创建新行的,可能有更好的方法,但这对我很有效:

<div style="display:inline;"> one line</div>

空行的另一种方法是:

<div style="height:1em;"></div>
pexxcrt2

pexxcrt28#

CSS有一个非常简单的解决方案:

.pre-wrap {
   white-space: pre-wrap;
}
<div class="pre-wrap">@MyMultiLineString</div>

相关问题