我擴展了 ASP.NET CheckBoxList Web 控制元件以創建 Bootstrap 5 布局版本。
該控制元件作業正常,但在回發時,它失去了檢查狀態。此外,控制元件的 SelectedItem 屬性為空。
我為 RadioButtonList 創建了相同的控制元件,它運行良好。使用 DotPeek,我看到它們都繼承了相同的控制元件和介面,所以我無法弄清楚為什么自定義 RadioButtonList 保持狀態而 CheckboxList 沒有。
有任何想法嗎?互聯網沒有可用的例子可言。
C#
public class Bootstrap5CheckBoxList : CheckBoxList {
protected override void Render(HtmlTextWriter writer) {
try {
var selected = false;
//var webControl = new WebControl(HtmlTextWriterTag.Div);
//webControl.ID = ClientID;
//webControl.RenderBeginTag(writer);
for (int index = 0; index < Items.Count; index ) {
var item = this.Items[index];
//div
writer.Indent ;
writer.WriteBeginTag($"div class='form-check {base.CssClass}'");
writer.Write('>');
writer.WriteLine();
//input
writer.Indent ;
writer.WriteBeginTag("input");
writer.WriteAttribute("id", $"{this.ID}_{index}");
writer.WriteAttribute("type", "checkbox");
writer.WriteAttribute("name", $"{this.UniqueID}_{index}");
var cssClass = "";
if (item.Attributes["class"] != null) {
cssClass = item.Attributes["class"];
}
writer.WriteAttribute("class", $"form-check-input {cssClass}");
writer.WriteAttribute("value", item.Value);
var clientID = this.ClientID;
if (item.Selected) {
if (selected) {
this.VerifyMultiSelect();
}
selected = true;
writer.WriteAttribute("checked", "checked");
}
if (item.Attributes.Count > 0) {
foreach (string key in item.Attributes.Keys) {
if (!"class".Equals(key)) {
writer.WriteAttribute(key, item.Attributes[key]);
}
}
}
if (!item.Enabled)
writer.WriteAttribute("disabled", "disabled");
if (this.Page != null) {
this.Page.ClientScript.RegisterForEventValidation(
this.UniqueID,
item.Value);
}
writer.Write('>');
writer.WriteEndTag("input");
writer.WriteLine();
//label
writer.WriteBeginTag("label");
writer.WriteAttribute("class", "form-check-label");
writer.WriteAttribute("for", $"{this.ID}_{index}");
writer.Write('>');
HttpUtility.HtmlEncode(item.Text, writer);
writer.WriteEndTag("label");
writer.Indent--;
writer.WriteLine();
//Close Div
writer.WriteEndTag("div");
writer.WriteLine();
writer.Indent--;
}
//webControl.RenderEndTag(writer);
} catch (Exception ex) {
throw new Exception(string.Format("{0}.{1}:{2} {3}", System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodBase.GetCurrentMethod().Name, ex.Message, ex.StackTrace));
}
}
}
HTML
<%@ Register TagPrefix="BSControls" Namespace="My.App.classes.custom_controls" Assembly="My.App" %>
<BSControls:Bootstrap5CheckBoxList ID="customCheckList" runat="server">
<asp:ListItem Value="1">Check 1</asp:ListItem>
<asp:ListItem Value="2">Check 2</asp:ListItem>
</BSControls:Bootstrap5CheckBoxList>
uj5u.com熱心網友回復:
看起來您現在正在使用 html 控制元件,并且它們沒有自動視圖狀態。您最好使用 CheckBox 串列,并使用引導程式對其進行格式化。并且最好在用戶控制元件標記中包含該復選框串列,并且盡可能不要撰寫代碼來注入此類控制元件。
因此,作為一般規則的普通簡復選框(輸入型別 = 復選框)沒有像 asp.net 控制元件那樣的自動視圖狀態。因此,要么將復選框串列放入您的用戶控制元件標記中,要么您可能必須添加代碼來保存/恢復值,因為它看起來很像您正在注入“輸入”控制元件而不是使用 asp。網路復選框串列。
uj5u.com熱心網友回復:
經過多次試驗,我能夠做到這一點,答案令人驚訝,或者可能并不簡單。
'name' 屬性是鍵并且必須采用正確的格式。
格式不正確
writer.WriteAttribute("name", $"{this.UniqueID}_{index}");
正確的格式
writer.WriteAttribute("name", $"{this.UniqueID}${index}");
您必須使用 $ 分隔符,而不是下劃線。在回發時,CheckBoxList 中的 LoadPostData 方法遍歷一個集合以檢索檢查狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/528804.html
標籤:网