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)は、パラメーターの大文字と小文字が正確に一致しない限り失敗します。

Entity Framework と 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 が正確に一致しない場合、選択オプションは選択されません。たとえば、これは機能します:

 http://localhost:35333/EqualsTest/Hello

そして、これはしません:

 http://localhost:35333/EqualsTest/hello

これはバグですか、それとも何か間違っていますか?

4

2 に答える 2

-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 に答える