在winform中首次使用net8做頁面。列表頁想使用Ant Design組件的彈窗組件實現。但第一次在winform項目中使用ant design組件,列表頁面,點擊新增,或者編輯操作實現彈窗頁面,彈窗頁面想使用模板頁razor頁來實現,而不是用modal組件彈窗的時候直接寫各種表單組件組合實現。但由于是第一次使用。彈窗根本實現不了,彈不出來。網上在github上能找出彈窗實現的開源項目,但是寫的太復雜,并不適用我的首次使用。最終為了趕工期。我用razor中內置的NavigationManager類實現了列表頁跳轉到新增頁面。提交成功后再回轉到列表頁。
但心心念念的彈窗實現我并未放棄。趁著星期天研究了幾次。最終實現了這一功能。
在列表頁要實現點擊新增或者編輯,彈窗打開一個編輯頁面。在編輯頁面操作新增或者修改,然后成功后關閉窗口,刷新列表頁,實現父頁面的更新。
這個在父頁面彈窗的時候有2個點需要實現。由于ant design組件的modal實現彈窗,其底部默認是有確認和取消按鈕的。而這里是不需要的。因為新增按鈕點擊后把數據存入數據庫后,只需要自動關閉窗口,并更新列表頁就可以了。
ModalRef? _modalRef;/// <summary>/// 彈出模板編輯頁面/// </summary>/// <returns></returns>private async Task OpenTemplate(int id){var manager = new BridgeAddressManager();BridgeAddress bridgeAddress = new BridgeAddress();if (id != 0){bridgeAddress = manager.GetById(id);}else{bridgeAddress.Id = 0;}var modalConfig = new ModalOptions{Title = id==0?"新增橋地址":"編輯橋地址",Width = 800,DestroyOnClose = true,Footer = null,AfterClose = () =>{Console.WriteLine("AfterClose");InvokeAsync(StateHasChanged);return Task.CompletedTask;} };_modalRef = modalService.CreateModal<BlazorUI.Template.EditBridgeAddress,BridgeAddress>(modalConfig,bridgeAddress);_modalRef.OnOpen = () =>{Console.WriteLine("ModalRef OnOpen");return Task.CompletedTask;};_modalRef.OnClose = () =>{Console.WriteLine("ModalRef OnClose");manager = new BridgeAddressManager();_dataSource = manager.GetList();InvokeAsync(StateHasChanged);return Task.CompletedTask;};}
這里底部去除確認和取消按鈕,只需ModalOptions設置Footer=null就可以。
這個彈窗只需實現兩個事件,其一,打開彈窗。其二,在關閉彈窗事件 OnClose中,數據源要重新讀取,并調用更新方法,刷新列表頁
頁面點擊新增或者編輯按鈕,調用這個方法。
<Button Style="width:100px;height:30px;border:solid 1px #0000ff;top:20px;font-size:15px;" OnClick="()=>OpenTemplate(0)" >新 增</Button>
在子組件彈窗中的razor頁面中關鍵代碼如下:
@inherits FeedbackComponent<BridgeAddress>
<Form Model="@_model"
LabelCol="new ColLayoutParam { Span = 4 }"
WrapperCol="new ColLayoutParam { Span = 15 }"
OnFinish="OnFinish"
OnFinishFailed="OnFinishFailed"> <FormItem Label="橋址編碼"> <Input @bind-Value="@_model.CodeHex" Placeholder="請輸入橋址編碼" ><Prefix>0X</Prefix><Suffix>16進制</Suffix></Input></FormItem><FormItem Label="備注"><TextArea @bind-Value="@_model.Remark" /></FormItem><GridRow><GridCol Span="4"></GridCol><GridCol Span="15" Class="right1"><Button Class="btn" HtmlType="submit" >@(_model.Id==0?"新增":"修改")</Button></GridCol><GridCol Span="4"></GridCol></GridRow></Form>
@inherits FeedbackComponent
這句關鍵,他直接把橋地址實例和子組件綁定。實現了頁面中從數據庫讀取的數據,綁定到頁面相關組件中。
還有一個關鍵處。實現的頗為曲折。就是在新增數據存入數據庫后,調用彈窗的關閉事件
await FeedbackRef!.CloseAsync(); // 操作成功,關閉彈窗
FeedbackRef是父頁面中ModalRef實例。但這個modalRef如何從父組件傳遞到子組件,并能夠使用卻不大好實現。在搜索引擎中搜索ant design組件這方面的應用,幾乎沒什么有用信息。用deepseek搜索有兩種實現方法。其一,使用[Parameter]參數,或者使用級聯參數來實現。但用他那個實現的樣例,卻獲取的都是空值,并不能用。
沒辦法,只能進行各種嘗試。最終在我的孜孜不倦的研究下,終于找到了實現方法,其實很簡單。我在modalService的創建彈窗中的反編譯代碼中發現了這個。
void Child無疑就是指子組件了。
builder.AddAttribute(1, "FeedbackRef", modalRef);
modalRef都賦予給了子組件的FeedbackRef屬性。這意味著我只要獲取FeedbackRe對象,就是modalRef對象了。
剛開始我以為要以參數獲取的形式實現
結果編譯運行,卻報錯了,說FeedbackRef必須唯一。我去除這兩行代碼。直接使用
await FeedbackRef!.CloseAsync(); // 操作成功,關閉彈窗
這次編譯運行,直接成功。原來,這個ModalRef在ant Design組件中使用如此簡單,直接可以拿來用。無需任何獲取操作