1

有许多类似的相关问题(和答案)(不区分大小写的字符串比较),但没有一个适用于 Razor C# 页面。

我正在使用 Visual Studio 2019 和 Blazor(Razor 页面和 C#)。浏览器是 Chrome 或 Edge(奇怪的是,它在 Internet Exploder 中运行良好......)

在我的剃须刀页面中,如果传递的 URL 参数与我的字符串数组中的项目匹配,我试图在 HTML 选择选项上设置“选定”选项。但是variable.Equals(param,StringComparison.OrdinalIgnoreCase)String.Equals(param,variable,StringComparison.OrdinalIgnoreCase)失败,除非参数的大小写完全匹配。

我正在使用实体框架和 SQL Server 数据库获取我的字符串数组。但为了说明问题,我将其压缩为 1 个 Razor 页面(无 EF 和无数据库):

@page "/EqualsTest/{incomingParam}"
<h3>EqualsTest</h3>

<p>incomingParam = @incomingParam</p>

<!--display list on page to show lengths-->
@foreach (var p in myParams)
{
    <p>'@p' = @p.Length</p>
}

<!--select list with passed param selected if it matches-->
<select @bind="@incomingParam">
    @foreach (var p in myParams)
    {
        @if (incomingParam.Equals(p, StringComparison.OrdinalIgnoreCase))
        {
            <option selected value="@p">@p</option>
        }
        else
        {
            <option value="@p">@p</option>
        }
    }
</select>

@code {
    [Parameter]
    public string incomingParam { get; set; }

    IEnumerable<string> myParams = new List<string>(){
        "Hello",
        "Whazzzup",
        "Goodbye"
    };
}

我尝试使用 String 类而不是字符串变量,但它的行为仍然相同。

我尝试使用临时字符串变量来查看是否有所作为,但仍然没有问题。

如果浏览器 URL 不完全匹配,则不会选择 select 选项。例如,这有效:

 http://localhost:35333/EqualsTest/Hello

这不会:

 http://localhost:35333/EqualsTest/hello

这是一个错误还是我做错了什么?

4

2 回答 2

0

@bind这主要是因为<select @bind="@incomingParam"> 尝试绑定到新变量,或者根本不绑定测试......

但是,就个人而言,我建议您将所有内容都保留为小写,并且.ToLower()您收到的任何参数都保留

更新 我看了一点,似乎@bind 支持@bind:converter 所以你可以使用LowerCaseStringConverter

 <select @bind="@incomingParam" @bind-converter="LowerCaseStringConverter">
    @foreach (var p in myParams)
    {
        @if (incomingParam.Equals(p, StringComparison.OrdinalIgnoreCase))
        {
            <option selected value="@p">@p</option>
        }
        else
        {
            <option value="@p">@p</option>
        }
    }
</select>
于 2020-01-30T02:08:56.377 回答
-1

如果我遍历 @code 部分中的数组,则字符串比较工作正常。

我可以在@code 部分使用这个技巧来解决这个问题:

protected override async Task OnInitializedAsync()
{
    foreach (var p in myParams)
    {
        if (incomingParam.Equals(p,StringComparison.OrdinalIgnoreCase))
        {
            incomingParam = p;
        }
    }
}

现在 Razor C# 代码中的字符串比较可以正常工作。

但我想知道为什么如果没有这个愚蠢的业务,它在 Razor 页面中不起作用。

更新:更好 - 没有编译器警告:

protected override void OnInitialized()
{
    base.OnInitialized();

    foreach (var p in myParams)
    {
        if (String.Equals(p, incomingParam, StringComparison.OrdinalIgnoreCase))
        {
            incomingParam = p;
        }
    }

更新:甚至更好 - 更改参数获取/设置属性:

@code {
    IEnumerable<string> myParams = new List<string>()
    {
        "Hello",
        "Whazzzup",
        "Goodbye"
    };

    private string _incomingParam;

    [Parameter]
    public string incomingParam
    {
        get => _incomingParam;
        set
        {
            _incomingParam = value; // set the default

            foreach (var p in myParams)
            {
                if (String.Equals(p, value, StringComparison.OrdinalIgnoreCase))
                {
                    _incomingParam = p;
                }
            }
        }
    }
}
于 2020-01-30T01:40:03.513 回答