**** AKTUALISIERT ****Convert C# zu client Javascript
Ich habe eine Asp.Net Seite mit einer Liste von Optionen, die von einer Checkbox in einer Listview-Kontrolle begleitet. Ich habe Paging mit dem Paging-Steuerelement angewendet. Ich möchte jedoch den Status der Kontrollkästchen auf den verschiedenen Seiten der ListView beibehalten. Ich habe dies
mit dem folgenden Code getanprivate List<int> IDs
{
get
{
if (this.ViewState["IDs"] == null)
{
this.ViewState["IDs"] = new List<int>();
}
return (List<int>)this.ViewState["IDs"];
}
}
protected void AddRowstoIDList()
{
int checkAction = 0;
foreach (ListViewDataItem lvi in lvCharOrgs.Items)
{
CheckBox chkSelect = (CheckBox)lvi.FindControl("chkSelect");
if ((((chkSelect) != null)))
{
int ID = Convert.ToInt32(lvCharOrgs.DataKeys[lvi.DisplayIndex].Value);
if ((chkSelect.Checked && !this.IDs.Contains(ID)))
{
this.IDs.Add(ID);
checkAction += 1;
}
else if ((!chkSelect.Checked && this.IDs.Contains(ID)))
{
this.IDs.Remove(ID);
}
}
}
}
protected void lvCharOrgs_ItemDataBound(object sender, ListViewItemEventArgs e)
{
ListViewDataItem lvi = (ListViewDataItem)e.Item;
if ((lvi.ItemType == ListViewItemType.DataItem))
{
// Find the checkbox in the current row
CheckBox chkSelect = (CheckBox)lvi.FindControl("chkSelect");
// Make sure we're referencing the correct control
if ((chkSelect) != null)
{
// If the ID exists in our list then check the checkbox
int ID = Convert.ToInt32(lvCharOrgs.DataKeys[lvi.DisplayIndex].Value);
chkSelect.Checked = this.IDs.Contains(ID);
}
}
if (Profile.proUserType == "basic")
{//basic account so no choice of charity
((CheckBox)e.Item.FindControl("chkSelect")).Checked = true;
((CheckBox)e.Item.FindControl("chkSelect")).Enabled = false;
}
}
Jetzt ich eine CustomValidator Kontrolle haben, die zwischen 3 & 5 Datensätze ausgewählt wurden, überprüft, um sicherzustellen. Wenn dies der Fall ist, ist die Seite gültig und wird verarbeitet. Wenn dies nicht der Fall ist (z. B. weniger als 3 oder mehr als 5), ist die Seite ungültig und der CustomValidator gibt eine Beschriftung aus, um auf diese Tatsache hinzuweisen.
Ich verwende den folgenden Code auf der Serverseite, um dies zu implementieren.
protected void lvCharOrgsValidator_ServerValidate(object source, ServerValidateEventArgs args)
{// Custom validate lvCharOrgs
//update selected rows
AddRowstoIDList();
//get count and verify is correct range
int counter = this.IDs.Count;
args.IsValid = (counter >=3 && counter <=5) ? true : false;
}
Das alles funktioniert gut axcept ich brauche einen 'ValidatorCallout' Extender aus dem AJAX Control Toolkit zu implementieren. Dies funktioniert jedoch nicht mit CustomValidators, es sei denn, sie implementieren die clientSide-Validierung. Daher muss ich die Methode 'lvCharOrgsValidator_ServerValidate' in eine clientseitige JavaScript-Funktion konvertieren.
Hoffe das klärt meine Anforderungen, und dass Sie helfen können.
Danke!
ich habe einen sm. all, Off-topic point: Die Verwendung des ternären Ausdrucks in der letzten Zeile ist überflüssig und unnötig. Das Ergebnis der Auswertung eines booleschen Ausdrucks ist ein boolescher Wert, sodass Sie das Ergebnis des Ausdrucks in Klammern direkt an args.IsValid übergeben können. Sehen Sie sich den Code in der Antwort von Russ Cam an. – Odrade