一、介紹 今天突然想起之前工作上遇到的一個問題,在做Blazor 開發時後端給的一個介面請求方式是Post ,但是他需要攜帶多個參數,新建一個公共類又覺得麻煩,我就嘗試著怎麼在Post請求中攜帶多個參數,由於接觸Asp .Net Core 的時間不夠長,所以這些都不是太瞭解, 今天寫下這篇文章做個記 ...
一:背景
1. 講故事
有一次同事找到我,說以下代碼中:btnPlanAppend控制項:客戶電腦顯示正常、開發者電腦調試時無法顯示
- btnAppend可以在界面中顯示出來
- btnPlanAppend控制項在界面上就是不顯示
private void Check_Privilege()
{
string sPrivilege = ClientUtils.GetPrivilege(g_sUserID, g_sFunction, g_sProgram).ToString();
btnAppend.Visible = SajetCommon.CheckEnabled("INSERT", sPrivilege);
btnPlanAppend.Visible = btnAppend.Visible;
}
二、分析
1. 使用VS調試
- SajetCommon.CheckEnabled("INSERT", sPrivilege)方法的返回結果:true;
- btnAppend控制項也能正常顯示
- 調試到這一行(btnPlanAppend.Visible = btnAppend.Visible;)btnAppend.Visible屬性始終返回false.
2. 分析ToolStripItem控制項源碼
- 通過此網站https://referencesource.microsoft.com/可以查詢.Net Framework源碼。
- btnAppend與btnPlanAppend控制項,都是ToolStripItem控制項,找到Visible屬性,代碼如下:
public bool Visible {
get {
return (ParentInternal!=null) && (ParentInternal.Visible) && Available;
}
set {
SetVisibleCore(value);
}
}
- 從代碼中可以看出,出現問題應該是由於ParentInternal不滿足條件。通過Parent英語單詞可以看出,ParentInternal屬性應該是與此控制項的父控制項有關係。
- 再看一下ParentInternal屬性的代碼
internal ToolStrip ParentInternal {
get {
return parent;
}
set {
if (parent != value) {
ToolStrip oldParent = parent;
parent = value;
OnParentChanged(oldParent, value);
}
}
}
- 控制項parent就應該是保存父控制項引用。
- 第一段代碼中Check_Privilege方法,是放在Form_Loaded事件中調用,可以推斷,調用Form_Loaded事件時,ToolStripItem還沒有真正的現在Form中顯示出來,parent應該為null.
3. 分析:現場電腦為什麼可以正常顯示
- 通過VS的查看,編譯環境中:目標框架:.NET Framework 2.0。看到這個好古老。
- 開發者電腦沒有.NET Framework 2.0的環境,調試時使用是新的.NET Framework庫。
三、總結
1. 修改代碼
- 通過分析,既然Form_Loaded事件中,獲得到btnAppend.Visible一直False。就不要使用btnAppend.Visible作為中轉變數。
- 創建一個臨時變數,btnAppend與btnPlanAppend的Visible都有臨時變數賦值就可以了。
2. 總結
- .NET Framework 版本很多,版本之間一定有差異,此類問題就是NET Framework差異造成。