如何使用 Blazor 更改 div 元素的类

bil*_*por 29 blazor

我在表单中的 cshtml 页面中有一个典型的 div 元素:

<div id="loginErrors" class="alert alert-danger hide-errors">@(ErrorMessage)</div>
Run Code Online (Sandbox Code Playgroud)

在 Blazor 之前,我通常使用 jQueryhide-errors在 div 中添加或删除类。但是,Blazor 正试图消除对 JavaScript 的需求,我正在尝试尽可能少地使用 JSInterop。Blazor 有没有办法做到这一点?

所以在 Blazor 我可以这样做:

 @if (!string.IsNullOrEmpty(ErrorMessage))
 {
     <div id="loginErrors" class="alert alert-danger">@(ErrorMessage)</div>
 }
 else
 {
     <div id="loginErrors" class="alert alert-danger hide-errors">@(ErrorMessage)</div>
 }
Run Code Online (Sandbox Code Playgroud)

或使用 JSinterop :

要求删除:

await JSRuntime.Current.InvokeAsync<object>("blazorExtensions.RemoveClass", "loginErrors", "hide-errors");
Run Code Online (Sandbox Code Playgroud)

函数通常是:

RemoveClass: function (id, classname) {
    var tt = '#' + id;
    $(tt).removeClass(classname);
}
Run Code Online (Sandbox Code Playgroud)

与添加类类似。上述两项工作,但如上所述。我试图避免 JSInterop 路由,我不喜欢 div 元素被声明两次,即使只有一个会进入 DOM。

Flo*_*res 38

就像您在常规 Razor 中所做的那样:

@if (price>30)
{
    <p>The price is too high.</p>
}
Run Code Online (Sandbox Code Playgroud)

编辑 对于更新的问题,我想你想要这个:

<div class="@((string.IsNullOrEmpty(ErrorMessage)? "hide-errors" : ""))">
Run Code Online (Sandbox Code Playgroud)


use*_*871 14

这非常简单,因为您可以在 Blazor 中动态更改 html 元素的任何部分,而无需使用 Javascript。我承认,经过这么多年,我花了一些时间才能摆脱旧的 Javascript 思维方式,但是一旦你这样做了,Blazor 就会摇滚!

在您的 html 某处使用一个变量作为您想要对其进行动态样式(或其他)修改的任何 html 元素的类名(或其他属性)。

    <img class="@myImageClass" src="@myImg" />
Run Code Online (Sandbox Code Playgroud)

在@functions 中声明您创建的任何变量...

    @functions {
    string myImageClass { get; set; }
    string myImg { get; set; } // Swap out the image as well if you want. 
Run Code Online (Sandbox Code Playgroud)

如果您想将项目设置为最初使用 OnInit()

     protected override void OnInit()
     {
     myImageClass = "myImageVisible";
     myImg = "https://www.somesite.com/ImageToStartWith.png"

     }
Run Code Online (Sandbox Code Playgroud)

函数中的某处将所需的类更改为您在样式部分中预定义的内容。

    private async Task DoSomething()
    {
      myImageClass = "myImageHidden";
      myImg = "https://www.somesite.com/NewImageToSwapIn.png"
      //Not sure what the point of swapping an image on a hidden element is 
      //but you get the idea. You can change anything you want anytime. 
    }
Run Code Online (Sandbox Code Playgroud)

不要忘记事先定义一些你想使用的样式。

     <style>
     .myImageVisible {
      display: block;
      }

     .myImageHidden{
      display: none;
      }
      </style>
Run Code Online (Sandbox Code Playgroud)

享受。:)

  • 对于每个编辑表单中包含 25 个以上字段的 LOB 应用程序来说,它并没有真正的优势,您必须在视图模型中处理 3-4 倍的属性数量。想一想。您需要一个用于实际数据的属性,一个用于 css 类的属性,一个用于禁用属性的属性,一个用于 tabindex 的属性...等等。与 JS 相比,您只需获取 ID 并直接设置属性,无需将其保存在广泛的视图模型中。 (4认同)
  • @LinusProxy 这就是 Blazor 组件的用武之地,您可以使用层次结构来完成其中的一些工作。您还可以使用 HTML5/CSS3 解决其中一些类型的问题,而无需执行任何 Blazor (C#) 或 JavaScript。在此特定示例中,可以使用 CSS3 转换(无需 JS/C#)。 (2认同)