簡體   English   中英

Blazor Webassembly EditForm 在 IISExpress 上工作,但在 IIS 上有問題

[英]Blazor Webassembly EditForm works on IISExpress but has Problem on IIS

我有一個 Blazor Webassembly 項目,在 iisexpress(visual studio 2019)上運行良好。 但是當我在 IIS 上部署它時,由於以下錯誤,我看不到登錄頁面:

暴擊:Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未處理的異常呈現組件:提供的表達式包含不受支持的 PropertyExpression。 FieldIdentifier 僅支持 object 的簡單成員訪問器(字段、屬性)。 System.ArgumentException:提供的表達式包含不受支持的 PropertyExpression。 FieldIdentifier 僅支持 object 的簡單成員訪問器(字段、屬性)。 at Microsoft.AspNetCore.Components.Forms.FieldIdentifier.ParseAccessor[String](Expression 1, Object&, String& ) at Microsoft.AspNetCore.Components.Forms.FieldIdentifier.Create[String](Expression 1 ) at Microsoft.AspNetCore.Components.Forms .InputBase 1[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].SetParametersAsync(ParameterView ) at Microsoft.AspNetCore.Components.Rendering.ComponentState.SetDirectParameters(ParameterView ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext&, Int32, Int32, Int32, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer, RenderBatchBuilder, Int32, ArrayRange 1[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].SetParametersAsync(ParameterView ) at Microsoft.AspNetCore.Components.Rendering.ComponentState.SetDirectParameters(ParameterView ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext&, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext&, Int32, Int32, Int32, Int32 ) at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer, RenderBatchBuilder, Int32, ArrayRange 1, ArrayRange `1) 在 Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderInExistingBatch(RenderQueueEntry) 在 Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue() 的 Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder, RenderFragment)

暴擊:Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未處理的異常渲染組件:當前沒有元素與組件 13 關聯錯誤:當前沒有元素與 e.updateComponent 中的組件 13 關聯(https://localhost/ _framework/blazor.webassembly.js:1:31703) 在 t.renderBatch (https://localhost/_framework/blazor.webassembly.js:1:12134) 在 window.Blazor._internal.renderBatch (https://localhost/_internal.renderBatch) _framework/blazor.webassembly.js:1:61913) 在 Object.w [as invokeJSFromDotNet] (https://localhost/_framework/blazor.webassembly.js:1:64435) 在 _mono_wasm_invoke_js_blazor (https://localhost/_framework/ dotnet.5.0.12.js:1:190800) 在 wasm_invoke_iiiiii (wasm://wasm/00aba242:wasm-function[5611]:0xdda7f) 在 ves_pinvoke_method (wasm://wasm/00aba242:wasm-function[5708]: 0xdfb62) 在 interp_exec_method (wasm://wasm/00aba242:wasm-function[2155]:0x44c08) 在 interp_run time_invoke (wasm://wasm/00aba242:wasm-function[7862]:0x12efff) 在 mono_jit_runtime_invoke (wasm://wasm/00aba242:wasm-function[7347]:0x118e5f)

. 當我用純 HTML 輸入替換 EditForm 時,一切正常:這是我的 EditForm:

  <EditForm Model="request" OnValidSubmit="OnValid" style="max-width:500px;">
                <DataAnnotationsValidator />
                <ValidationSummary />
                <div class="input-group mb-3">
                    <InputText class="form-control" @bind-Value="request.Username" placeholder="نام کاربری"></InputText>

                    <div class="input-group-append">
                        <span class="fa fa-user input-group-text"></span>
                    </div>
                </div>
                <div class="input-group mb-3">
                    <InputText type="password" class="form-control" @bind-Value="request.Password" placeholder="رمز عبور"></InputText>

                    <div class="input-group-append">
                        <span class="fa fa-lock input-group-text"></span>
                    </div>
                </div>
                <div class="row">

                    <!-- /.col -->
                    <div class="col-4">
                        <button class="btn btn-primary btn-block btn-flat" disabled="@isDisabled">ورود</button>
                    </div>
                    <div class="col-8">
                        <img src="dist/img/allin-logo.png" width="140" height="100" />
                    </div>
                    <!-- /.col -->
                </div>
            
            </EditForm>

這是背后的代碼:

[Inject]
    public IAccountService accountService { get; set; }

    [Inject]
    public NavigationManager navigationManager { get; set; }
    public AuthenticationRequest request { get; set; }

    private string message { get; set; }
    private bool isDisabled { get; set; }

    public Login()
    {
        
        request = new AuthenticationRequest();
      
        message = string.Empty;
        isDisabled = false;
      

    }


    private async void OnValid()
    {
        isDisabled = true;

        var result = await accountService.LoginAsync(request);

        if (result)
        {
            navigationManager.NavigateTo("/");
        }
        else
        {
            isDisabled = false;
            message = "نام کاربری یا رمز عبور اشتباه است";
        }


    }

我應該怎么辦?!

更新:將 void OnValid() 更改為 Task OnValid() 並沒有解決問題。

Blazor Webassembly完全在瀏覽器上運行。 服務器版本或版本根本不起作用。 IIS 或 IIS Express 都沒有問題。

該錯誤使用async void而不是async Task 不能等待帶有async void簽名的方法。

要修復它, async void OnValid更改為async Task OnValid甚至更好的async Task OnValidAsync

    <EditForm Model="request" OnValidSubmit="OnValid" style="max-width:500px;">
    </EditForm>

@code {
    private async Task OnValidAsync()
    {
        isDisabled = true;

        var result = await accountService.LoginAsync(request);
        ...

    }
}

async void簽名適用於桌面應用程序(WinForms、WPF)中的異步事件處理程序。 這些框架是在Task引入之前創建的,不知道如何等待異步方法。

不返回結果的異步方法應使用async Task簽名。 返回值的方法使用async Task<T>

另一方面,Blazor 內置了異步操作。所有 Blazor 示例都使用async Task代替。 例如:

@page "/set-params-async/{Param?}"

<p>@message</p>

@code {
    private string message = "Not set";

    [Parameter]
    public string? Param { get; set; }

    public override async Task SetParametersAsync(ParameterView parameters)
    {
        if (parameters.TryGetValue<string>(nameof(Param), out var value))
        {
            if (value is null)
            {
                message = "The value of 'Param' is null.";
            }
            else
            {
                message = $"The value of 'Param' is {value}.";
            }
        }

        await base.SetParametersAsync(parameters);
    }
}

sdk 版本之間存在不匹配。 項目使用 .net 5.0 構建,但 .net 運行時為 .net 6.0.1。 通過卸載 .net 6,一切正常! 感謝您的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM