【问题标题】:Blazor binding input value not working on button clickBlazor 绑定输入值在按钮单击时不起作用
【发布时间】:2021-11-16 05:33:09
【问题描述】:

我正在使用 Blazor 服务器端订阅时事通讯。当我按下订阅按钮时,我看到系统没有将 EmailAddress 绑定到用户输入的电子邮件地址。我错过了什么?

@inherits InstaTranscribeServerSide.Layouts.SubscribeToNewsletterComponent

<div class="container">
      <form class="mt-4">            
            <input type="email" name="email" placeholder="Enter your email address" text="@EmailAddress">
              <button type="button" @onclick="SubscribeToNewsletterClick">
              </button>
      </form>
</div>

public class SubscribeToNewsletterComponent : InstaTranscribeComponentBase
  {
    [Inject] protected ILogger<SubscribeToNewsletter> logger { get; set; }
    protected string EmailAddress { get; set; } = string.Empty;
    protected async Task SubscribeToNewsletterClick()
    {
      try
      {
        await this.EmailSender.AddUpdateContactAsync(EmailAddress);
        await JSRuntime.NotifySuccess($"You have been subscribed to our newsletter.");
      }
      catch (Exception exception)
      {
        await JSRuntime.NotifyError($"There was an error subscribing you to our newsletter.");
      }
    }
    protected override async Task OnInitializedAsync()
    {      
    }
}

显示电子邮件地址为空白的屏幕截图:

屏幕截图显示用户输入的电子邮件地址:

【问题讨论】:

    标签: c# asp.net-core blazor blazor-server-side


    【解决方案1】:

    尝试使用@bind-value="EmailAddress" 这是双向数据绑定在 blazor 中的工作方式,您也可以将 value="@EmailAddress" 仅用于一种方式,您始终可以将输入作为参考并访问其属性

    【讨论】:

    • 上述解决方案无效。
    • 更改为 @bind-value="@EmailAddress" 有效。谢谢@khashayarPakkhesal
    【解决方案2】:

    您的页面看起来有点“非 Blazor”。仅供参考,这是您页面的相当经典的 Blazor 版本。

    它使用 Blazor EditForm 组件和页内状态显示。

    @page "/"
    <h3>Subscribe To My Site</h3>
    <EditForm EditContext=this.editContext OnSubmit=this.SubmitForm>
        <div class="col">
            <InputText class="form-control" typeof="email" @bind-Value=this.model.Email placeholder="Enter your email address" />
        </div>
        <div class="col m-2 p-2 text-end">
        <button type="submit" class="btn btn-primary">Subscribe</button>
        </div>
    </EditForm>
    @if (this.isMessage)
    {
        <div class="m-2">
            <div class="alert @this.alertCss">@this.message</div>
        </div>
    }
    
    @code {
        private NewsLetterCredentials model = new NewsLetterCredentials();
    
        private EditContext? editContext;
    
        private string message = string.Empty;
        private bool isMessage => !string.IsNullOrWhiteSpace(message);
        private string alertCss => this.success ? "alert-success" : "alert-danger";
        private bool success = true;
    
        protected override void OnInitialized()
            => this.editContext = new EditContext(model);
    
        private async Task SubmitForm()
        {
            await Task.Delay(200);
            // emulate save to database
            this.success = !this.success;
            this.message = this.success
                ? "Subscribed"
                : "Error Subscribing";
    
        }
    
        public class NewsLetterCredentials
        {
            public string Email { get; set; } = string.Empty;
        }
    }
    

    【讨论】:

    • [非常有礼貌] 您的按钮元素缺少 type="submit" 属性。顺便说一句,我看不出有什么理由在这里使用 Forms 元素,而且我猜想这里应用了 form 元素而没有考虑太多,因为没有暗示 post 请求,并且无论如何,表单不能登顶,因为 button 元素的 type 属性设置为“button”
    • 投了你一票......
    • @enet 。您实际上不需要设置按钮类型 - 默认是 submit 而不是 buttonform 上下文中。运行代码看看。
    • 是的,你是对的,这就是为什么我提到由于 type 属性设置为 button.,提问者的代码不会导致 HTTP 发布请求。通过在表格中添加type="submit" 来明确自己的意图很重要。极简主义很糟糕,Net 6.0 中引入的极简主义很糟糕,可能会导致很多问题和误解。请参阅此问题,了解极简主义如何为人们工作:stackoverflow.com/q/69970525/6152891
    • 我通常坚持这种做法。正如我之前向人们引用的那样,“如果 MS 将 bool 的默认值更改为 true,请想象一下混乱!”。所以这实际上是我的一个疏忽,当我编译和运行代码时它起作用了(但后来没有审查它)所以我错过了正确地做它。我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2022-01-06
    • 2017-03-09
    • 1970-01-01
    相关资源
    最近更新 更多