繁体   English   中英

如何在获取参数集时调用 Blazor 服务器端应用程序中的方法

[英]How to call a method in Blazor Server Side App on get set of a parameter

我有一个 select 控件绑定到选定的值。 由于我不能同时使用@onChange 和@bind,所以@bind 版本是什么:

<select @onchange='(e  => DisplayToggle(e, "DMGReported"))' class="form-control">
    <option value=" "> </option>
    <option value="Yes">Yes</option>
    <option value="No">No</option>
</select>

执行:

async Task DisplayToggle(ChangeEventArgs e, string DivToToggle)
{
    selectedString = e.Value.ToString();
    //Do something with that selected value
}

使用 OnParamterSet(),它会触发一次......但如果下拉列表中的选定选项发生更改,它不会再次触发 go。 尝试在参数的 get/set 中调用方法会导致页面出现堆栈溢出,并重复数千次。 在我偶然发现这个之后我尝试了:

如何使用Blazor中的参数调用Function?

在此处输入图像描述

<select @bind="selectedString">
   <option value=" "> </option>
   <option value="Yes">Yes</option>
   <option value="No">No</option>
</select>
<p>@className</p>
string className = "";

public string selectedString
{
    get => Test(selectedString);
    set { selectedString = value; }

}

public string Test(string test)
{
   
        if (selectedString == "Yes")
        {
            className = "It worked";
        }
        else
        {
            className = "It Failed";
        }
        
    return test;
}

功能代码感谢 Brian Parker 的帮助:奇怪的是,这必须在页面上:

<p style="display:none;">@dmgReported</p>

为此:

string selectedString;
string dmgReported => packageSubmission.RepDmg switch
{
    "Yes" => ToggleDiv("Yes", "DMGNotReported", "DMGReported"),
    "No" => ToggleDiv("No", "DMGReported", "DMGNotReported"),
    _ => ToggleDiv("", "DMGReported", "DMGNotReported")
};
public string ToggleDiv(string YesNo, string DivToHide, string DivToShow)
{
    try
    {
        if (!String.IsNullOrEmpty(packageSubmission.RepDmg))
        {
            if (YesNo == "No" || YesNo == "Yes")
            {
                JSRuntime.InvokeAsync<object>("hideElement", new { id = DivToHide });
                JSRuntime.InvokeAsync<object>("showGroup", new { id = DivToShow });
            }               
            else
            {
                JSRuntime.InvokeAsync<object>("hideElement", new { id = DivToHide });
                JSRuntime.InvokeAsync<object>("hideElement", new { id = DivToShow });
            }
        }
    }
    catch { }
    return DivToHide;
}

您不必使用二传手。 只是基于绑定值的计算属性。

<select @bind="selectedString">
   <option value=" "> </option>
   <option value="Yes">Yes</option>
   <option value="No">No</option>
</select>

<p>@className</p>

@code {
   string selectedString;
   string className => selectedString switch 
   {
       "Yes" => "It worked",
       "No" => "It failed",
       _ => ""
   };
}

BlazorRepl

如果你需要使用setter:

<select @bind="SelectedString">
   <option value=" "> </option>
   <option value="Yes">Yes</option>
   <option value="No">No</option>
</select>

<p>@className</p>
@code {
   string className;
   string selectedString;
   string SelectedString 
   {
       get => selectedString;
       set 
       {
            if(selectedString == value) return; // Do nothing
            selectedString = value;
            className = value switch 
            {
                "Yes" => "It worked",
                "No" => "It failed",
                _ => ""                
            };        
       }
   }
}

BlazorRepl

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM