Vorwort: In den beiden vorherigen Artikeln werden einige grundlegende Formularkomponenten zusammengefasst, und dieser Artikel verkapuliert weiterhin mehrere andere Komponenten basierend auf Bootstrap. Im Gegensatz zum vorherigen Artikel gibt es in diesem Artikel mehrere Komponenten, die Unterstützung für bestimmte JS -Dateien erfordern.
Artikelkatalog für BootStrapsraphelper -Serien
C# Advanced Series - STOTSTRAPHELPER SCHRITTEN SIE SEINEN HTMLHELPER -Komponente Schritt für Schritt ein.
C# Advanced Series - Einkapseln Sie seine eigene HTMLHelper -Komponente Schritt für Schritt: Bootstreraphelper (ii)
C# Advanced Series - STOTTRAPHELPER (3: mit Quellcode) einkapseln Sie seine eigene HTMLHelper -Komponente.
1. NumberBoxextensions
NumberBoxextensions ist ein digitales Textfeld, das auf dem Bootstrap -Stil basiert. Es wird von Spinner, einer vom Blogger eingeführten Digitalkomponente, eingekapselt. Diejenigen, die die Spinnerkomponente nicht verstehen, können sich die zweite Komponente ansehen, die in http://www.vevb.com/article/88490.htm eingeführt wird.
Durch die vorherige Einführung wissen wir, dass die Initialisierung des selbststeigenden Komponentenspinners kein JS-Code schreiben muss. Es kann direkt durch Konfigurieren des Datenattributs in der HTML initialisiert werden. Dies bringt große Bequemlichkeit in unsere Verkapselung. Wir müssen nur die häufig verwendeten Initialisierungsparameter als Parameter der Erweiterungsmethode übergeben und sie dann in das entsprechende Datenattribut im Hintergrund verwandeln und an das vordere Ende zurückgeben.
Setzen Sie den eingekapselten Quellcode ohne weiteres zuerst an.
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace BootstrapExtensions{ public static class NumberBoxExtensions { /// <summary> /// Generate a number text box/// </summary> /// <param name="html">Extension method instance</param> /// <param name = "id"> id </param> /// <zurückgegeben> das Textfeld Number zurückgibt </zurückgibt> public static mvchtmlstring numbertextBox (dieses BootStRAPHELPER html, String -ID) {return numbertextBox (html, id, null, null, null, null, null); } /// <summary> /// ein numerisches Textfeld erstellen /// </summary> /// <param name = "html"> Extension Methode Beispiel </param> // <param name = "id"> id <// // <param name = "value"> text -kästbuden <// <// <// <// <//r zurückrückkehrt. BootStRapraphelper HTML, String -ID, Objektwert) {return numbertextBox (HTML, ID, Wert, NULL, NULL, NULL); } /// <summary> /// Generate a numeric text box/// </summary> /// <param name="html">Extension method instance</param> /// <param name="value">The value of the text box</param> /// <param name="min">The minimum value of self-growth</param> /// <param name="max">Maximum value</param> /// <Ctrippites> Gibt das numerische Textfeld zurück </retektiert> public static mvchtmlString numbertextBox (dieses BootStRAPHELPER HTML, Objektwert, int? min, int? max) {return numbertextbox (html, null, value, max, max, null, null); } /// <summary> /// Generate a numeric text box/// </summary> /// <param name="html">Extension method instance</param> /// <param name="id">id</param> /// <param name="value">text box value</param> /// <param name="min">min self-growth</param> /// <param name="max">maximum Selbstwachstum </param> /// <zurückgegeben> Rückgabe des Number-Textfelds </zurückgibt> public static mvchtmlString NumbertextBox (dieses BootStRAPHELPER HTML, String-ID, Objektwert, int? min, int? max) {return numbertextBox (html, id, value, min, max, null, null, null); } /// <summary> /// Ein Zahlen-Textfeld /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> // <param name = "id"> id <// Param> // <param name = "value"> Der Wert der Textbox <//// <paramname = "min" name = "max"> Maximales Selbstwachstum </param> /// <param name = "step"> number selbstwachstum </param> // <returns> return the number text-feld min, max, step, null); } /// <summary> /// Zahlen Textfeld /// </summary> /// <param name = "html"> Erweiterungsmethode Beispiel </param> // <param name = "id"> id </param> // <param name = "value" name = "max"> Maximaler Wert des Selbstwachstums </param> /// <param name = "step"> Anzahl des Selbstwachstums </param> /// <param name = "step"> Anzahl des Selbstwachstums </param> // <param name = "regel"> Selbstwachstum Regeln BootstrapHelper HTML, String -ID, Objektwert, int? Tag.Mergeattribute ("Klasse", "Eingabegruppenspinner"); tag.mergattribute ("Datenauslöser", "Spinner"); System.Text.StringBuilder SB = New System.Text.StringBuilder (); //sb.Append("<Input type = 'text' class = 'form-control text-center' value = '1' data-min = '-10' data-max = '10 'data-step =' 2 'data-rule =' Quantity '> "); sb.Append ("<Eingabe type = 'text' class = 'Form-kontroll-text-center'"); if (! string.isnullorEmpty (id)) {sb.append ("id = '"). append (id) .Append ("'"); } if (value! } else {sb.append ("value = '1'"); } if (min! } if (max! } if (Schritt! } if (regel! } else {sb.append ("data-role = 'mantity'"); } sb.append ("/>"); sb.Append ("<span class = 'Eingabegruppe-gruppen-addon'>"); sb.append ("<a href = 'javaScript;' class = 'spin-up' data-spin = 'up'> <i class = 'fa fa-caret-up'> </i> </a>"); sb.append ("<a href = 'javaScript:;' class = 'spin-down' data-spin = 'Down'> <i class = 'fa fa-caret-down'> </i> </a>"); sb.Append ("</span>"); tag.innerhtml = sb.toString (); return mvchtmlstring.create (Tag.ToString ()); }} public enum spinningrule {Standardeinstellungen, Währung, Menge, Prozent, Monat, Tag, Stunde, Minute, zweiter,}}Zusätzlich zu ID und Wert sind die für die Initialisierung der Komponente erforderlichen Parameter hauptsächlich min, max, stufen, regel usw., was der Datenminen-, Datenmax-, Datenschritt-, Datenregel- und anderen Parametern der Komponente entspricht.
Verwendung ist recht einfach. Beachten Sie zuerst die relevanten JS- und CSS -Dateien auf der entsprechenden Seite und nennen Sie sie dann in CSHTML so:
Kopieren Sie den Code wie folgt: @bootstrap.numberTextBox (NULL, "1", 1, 10, 2, NULL)
Holen Sie sich das Ergebnis:
Dies ist viel bequemer, als jedes Mal ein großes Stück HTML -Code zu kopieren. Fühlst du dich ein wenig bewegt?
2. DateTimeBoxextensionen
Mit den oben genannten digitalen Komponenten als Grundlage besteht der nächste Schritt darin, die Zeitkomponenten zu verringern. Der Blogger plant außerdem, das Datenattribut zu verwenden, um es zu initialisieren. Nach langer Zeit gibt es jedoch keine Möglichkeit, das Datenattribut im DataTimePicker zu initialisieren. Es gibt keinen Weg, so dass der Blogger das Datenattribut nur selbst initialisiert.
1. Erstplan
Lassen Sie uns eine neue Datei erstellen: Bootsstrap-DateTimePicker-Helper.js. Der Code im Inneren ist wie folgt
$ (function () {var datetimedefault = {Locale: 'zh-cn', // chinesische Kultur}; $ .each ($ (". Datum"), Funktion (INDEX, Element) {var data = $ (item) .data (); var param = $ .extend ({}, datetimedefault, data || | });});Schreiben Sie dann den HTML -Code wie diesen
<div class = 'Input-Gruppendatum' data-format = "yyyy-mm-dd" data-maxdate = "2017-01-10" data-mindate = "2010-01-10"> <Eingabe type = 'text'/> <span> </span> </span> </div>
Es scheint, dass es kein Problem gibt, und zuerst dachte der Blogger, dass es kein Problem gibt. Aber die Dinge blieben gegen meine Wünsche! Es gibt eine Sache, die der Blogger nicht berücksichtigt hat, dh die von der Daten () () in JQuery erhaltenen Attributnamen werden in Kleinbuchstaben konvertiert. Das heißt, das in HTML geschriebene Datenmaxdat, das Ergebnis, das durch die Daten-() -Methode) erzielt wird, wird Maxdat, wie in der folgenden Abbildung gezeigt:
Wenn dann der DateTimePicker initialisiert wird, wird eine JS -Ausnahme gemeldet. Diese Methode funktioniert nicht.
2. Verbesserungsplan
Da die obige Methode nicht funktioniert, müssen wir sie verbessern. Gibt es Parameter in der Data () -Methode, die verhindern können, dass sie Kleinbuchstaben sind? Nachdem ich nachgesehen hatte, konnte ich keine Antworten finden. Am Ende gab es keinen Weg, der Blogger hatte vor, es selbst zu verwandeln, so dass der JS -Code so wurde:
$(function () { var datetimedefault = { format: 'YYYY-MM-DD',//Date formatting, only the date locale: 'zh-CN', //Chinese culture maxDate: '2017-01-01',//Maximum date minDate: '2010-01-01', //Minimum date viewMode: 'days', defaultDate: false, disabledDates: false, EnabledDates: False,}; $ .extend ({}, datetimedefault, Daten || {});Das Prinzip besteht darin, die von der Data () -Methode erhaltenen Ergebnisse mit dem Attributnamen des DateTimedEfault nach der Umwandlung von Kleinbuchstaben zu vergleichen. Wenn dies gilt, wird das Datenattribut in der HTML überschrieben. Nach mehrmals Debugugging fand ich im Grunde keine Probleme.
Das Schreiben des Codes wie diesen kann tatsächlich unsere oben genannten Probleme lösen, aber unsere datetimedefault -Variable muss genügend Standardparameter enthalten, um den Zweck der Abdeckung zu erreichen. Natürlich gibt es nur wenige Parameter, die im Projekt im Allgemeinen geändert werden, und nur einige Standardattribute, die wir häufig ändern müssen, werden hier hinzugefügt.
Okay, mit der oben genannten als theoretischen Basis kann unsere DataTimeBox leicht verkapselt werden. Laden Sie einfach den Code hoch.
Verwenden von System; system.collectionss.generic; Verwendung von System.LinQ; Verwendung von System.Web; Verwendung von System.web.mvc; Namespace BootStrapextensions {public static class DateTimeBoxextensions {/// <summary> /// // Datumskontrolle // <//2> // <param name = "html"> extensions -Methode <// /// <param name = "html" of text box tag</param> /// <returns>Return the html tag that renders the date control</returns> public static MvcHtmlString DateTimeBox(this BootstrapHelper html, string id) { return DateTimeBox(html, id, null, null, null, null, null); } /// <summary> /// Datumskontrolle erzeugen /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> // <param name = "id"> id des Textfelds Tag </param> // <param name = "value"> Default -Wert des Textkasten -Tags. MVCHTMLString DateTimeBox (dieses BootStraphelper HTML, String -ID, Objektwert) {return dateTimeBox (HTML, ID, Wert, Null, NULL, NULL, NULL); } /// <summary> /// Datumskontrolle erzeugen /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> // <param name = "id"> id des Textfelds Tag <//// <param name = "value"> Default -Wert des Textfeld -Tags </// /// <param> <param> /// <param> <param> <param> name = "format"> <param name = "maxdate"> Minimaler Wert des Datums </param> /// <param name = "mindate"> Maximaler Wert des Datums </param> // <returns> return das html -Tag, das das Datumskontrolle </zurückträgt,> return> öffentlich -statische MVCHTMLSTRING -DATETIMETIMETIGE DATETIMEBEGEBENDET, STRINGMLSTRING -DATETIMEL (this -statik -machat, thatetimeBox (this). String mindate) {return dateTimeBox (HTML, ID, Wert, Format, MaxDate, Mindate, NULL, NULL); } /// <summary> /// Datumskontrolle erzeugen /// </summary> /// <param name = "html"> Erweiterungsmethode Beispiel </param> // <param name = "id"> id des Textfelds der Textfeldbezeichnung <// Param> // <param name = "value"> Default -Wert des Textkastens -Labels </// /// <param name = "Format". name = "maxdate"> Minimaler Wert des Datums </param> /// <param name = "mindate"> Maximaler Wert des Datums </param> /// <param name = "viewMode"> Durchsuchen der Datumsregelung. MVCHTMLString DateTimeBox (dieses BootStRAPHELPER HTML, String -ID, Objektwert, String -Format, String maxdate, String mindate, String -ViewMode, Bool? ShowClear) {Tagbuilder Tag = new Tagbuilder ("div"); tag.mergattribute ("Klasse", "Eingabegruppendatum"); if (! string.isnullorempy (format)) {tag.mergeattribute ("data-format", format); } if (! string.isnullorEmpty (maxDate)) {Tag.Mergeattribute ("data-maxdate", maxdate); } if (! string.isnullorEmpty (mindate)) {Tag.Mergeattribute ("Data-mindat", Mindate); } if (! string.isnullorEmpty (viewMode)) {Tag.Mergeattribute ("Data-viewMode", ViewMode); } if (showClear! } System.Text.StringBuilder SB = New System.Text.StringBuilder (); SB.Append ("<Eingabe type = 'text' class = 'form-control'"); if (! string.isnullorEmpty (id)) {sb.append ("id = '"). append (id) .Append ("'"); } if (value! } sb.append ("/>"). append ("<span class = 'Eingabegruppe-Gruppen-Addon'>") .Append ("<span class = 'glyphicon glyphicon-calendar'> </span>") .Append ("</span>"); tag.innerhtml = sb.toString (); return mvchtmlstring.create (Tag.ToString ()); }}}Dann muss unsere CSHTML -Seite nur auf unsere JS und CSS verweisen
<link href = "~/content/bootstrap-datetimePicker/css/bootstrap-dateTimePicker.css" rel = "stylesheet"/> <script src = "~/content/bootstrap-datetimePicker/js/moment-with-locales.js"> </script-datetimePicker/jungen-with-locales.js "> </</script> </script: src = "~/content/bootstrap-dateTimePicker/js/bootstrap-dateTimePicker-helper.js"> </script>
Verwenden Sie es dann direkt
<div> @bootstrap.datetimeBox ("Starttime", Null, Null, Null, Null, Null) </div> <div> @bootstrap.datetimeBox ("Endtime", Null, Null, Null, Null, Null, Null) </div> </div> </div>Ergebnisse erhalten
3.. Textareextensionen
Die Einkapselung des Textfelds des Textbereichs ist relativ einfach, da seine Struktur der von Textbox ähnelt. Geben wir den Kapselungsquellcode direkt an.
Verwenden von System; Verwendung von System.Collectionss.generic; Verwendung von System.LinQ; Verwendung von System.Web; Verwendung von System.Web.Mvc; Namespace BootStrapextensions {public static class textareextesions {/// <summary> /// TextArea -Textfeld // <//2> // <param name = "html"> Erweiterungsmethode <// /// <param = "html" name = "id"> id </param> /// <zurückgegeben> HTML -Tag </retektiert> public static mvchtmlstring textAreeaxbox (dieser Boots -STRAPHELPER html, String -ID) {return textArebox (html, id, null, null, null); } /// <summary> /// TextArea -Textfeld /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> /// <param name = "id"> id </param> // <param name = "value"> value </param> // <// <paramname = " statische mvchtmlString textAreaxbox (diese Bootsstraphelper HTML, String -ID, Objektwert, String -CSSClass) {return textArebox (HTML, ID, Wert, CSSSCLASS, NULL, NULL); } /// <summary> /// TextArea -Textfeld /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> /// <param name = "id"> id </param> // <param name = "value"> value </param> // <paramname = "cs rows</param> /// <returns>html tag</returns> public static MvcHtmlString TextAreaBox(this BootstrapHelper html, string id, object value, string cssClass, int? rows) { return TextAreaBox(html, id, value, cssClass, rows, null); } /// <summary> /// TextArea -Textfeld /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> /// <param name = "id"> id </param> // <param name = "value"> value </param> // <paramname = "cs Zeilen </param> /// <param name = "cols"> Anzahl der Spalten </param> /// <returns> HTML -Tag </returns> public static mvchtmlstring textArekobox (diese Boots -STRAPHELPER HTML, String -ID, Objektwert, String CSSCLASS, int? tag.addcssClass ("Form-kontroll"); if (! string.isnullorempy (id)) {Tag.Mergeattribute ("id", id); } if (value! } if (! string.isnullorEmpty (CSSCASS)) {Tag.AddcssClass (CSSSClass); } if (Zeilen! } if (cols! } return mvchtmlstring.create (tag.toString ()); }}}Nur wenige einfachste Parameterreihen und Cols werden unterstützt. Wenn Ihr Projekt einige besondere Bedürfnisse enthält, z. B. das Initialisieren in ein reichhaltiges Textbearbeitungsfeld, können Sie es auch selbst verbessern.
Wie man benutzt
<div> @bootstrap.textAreAbox ("id", "", "", 3, 5) </div>Es gibt eine Frage, die hier erwähnt werden kann, dh sie schreiben sie direkt, aber das Ergebnis ist:
Es scheint, dass unser Cols -Attribut nicht funktioniert. Es stellt sich heraus, dass, solange Ihr Tag mit Class = 'Form-Control' -Stil hinzugefügt wird, die gesamte DIV füllt und die Lösung auch sehr einfach ist. Zum Beispiel können wir auf der DIV eine Verarbeitung durchführen:
Kopieren Sie den Code wie folgt: <Div> @bootstrap.textAreaBox ("", ",", ", 3, 5) </div>
Da das COLS -Attribut nicht funktioniert, können die Cols in den Parametern als entfernt angesehen werden.
4. Selectextensionen
Es ist Zeit, wieder das Dropdown-Box Tangled Select zu erzielen. Warum sagst du, es ist verwirrt? Weil es bei der Einkapselung viele Probleme zu berücksichtigen gibt, wie z. B.:
Wie gehe ich mit statischen Optionswerten um? Wie übergeben Sie sie an den Hintergrund? Wird das ursprüngliche ausgewählte oder in ausgewählte Methoden und Ereignisse in bestimmten Komponenten (z. B. ausgewählte) ausgewählte Methoden und Ereignisse eingekapselt?
Später dachte ich darüber nach, was ist der Zweck der Einkapselung? Ist es nicht nur bequemer zu verwenden? Wenn es zu hart versiegelt ist, wird es dann bequem zu verwenden? Glücklicherweise wurde es direkt in die einfachste Auswahl eingekapselt. Der Blogger beabsichtigt, dies zu tun:
Wenn es sich um eine statische Option handelt, schreiben Sie direkt das native Select -Tag. Wenn es sich um eine dynamische Option handelt, übergeben Sie die entsprechende URL an den Hintergrund und generieren Sie die Option, nachdem Sie die Daten erhalten haben. Der eingekapselte Code lautet wie folgt:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace BootstrapExtensions{ public static class SelectExtensions { /// <summary> /// Return select tag/// </summary> /// <param name="html">Extension method instance</param> /// <param name="id">Tag id </param> /// <zurückgegeben> Tag </zurückgibt> public static mvchtmlString SELECTBOX (dieses BootStraphelper html, String id) {return selectbox (html, id, null, null, null, null, null); } /// <summary> /// Wählen Sie Tag /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> /// <param name = "id"> Tag -ID <// Param> // <param name = "value"> tagst -Wert </param> // <// <// return HTML, String -ID, Objektwert) {return selectBox (HTML, ID, Wert, NULL, NULL, NULL, NULL); } /// <summary> /// Return Select Tag /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> // <param name = "id"> tag id <// </// <param name = "value"> tag ausgewählter Wert </param> // <// <// <// <Params> - csSclasses "> tagsclass"> tags "> tag"> tags "> tags cs static mvCHTMLString SELECTBOX (dieses BootStraphelper HTML, String -ID, Objektwert, String -CSSClass) {return selectBox (HTML, ID, Wert, CSSCLASS, NULL, NULL, NULL, NULL); } /// <summary> /// Rückgabe -Tag /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> // <param name = "id"> Tag -ID </param> // <param name = "value"> tag ausgewählter Wert </param> // <// <param name = " requesting data</param> /// <param name="url">url for requesting data</param> /// <param name="textField">Show field</param> /// <param name="valueField">Value field</param> /// <returns>select tag</returns> public static MvcHtmlString SelectBox(this BootstrapHelper html, string id, object value, string cssClass, String -URL, String TextField, String ValueField) {return selectBox (HTML, ID, Wert, CSSCLASS, URL, NULL, TextField, ValueField); } /// <summary> /// Wählen Sie Tag /// </summary> /// <param name = "html"> Erweiterungsmethodeinstanz </param> /// <param name = "id"> Tag -ID </param> // <param name = "value"> tag ausgewählter Wert </param> // <// <// <Paramname = " URL </param> /// <param name = "param"> angeforderte Parameter </param> /// <param name = "textField"> Felder anzeigen </param> /// <param name = "valueField"> Wertefelder </param> // <param name = "valuefield"> value fields <//// </// <// <paramname = "value name = "multiple"> ist Multiple Choice </param> /// <zurückgegeben> Tag </zurückgibt> public static mvCHTMlString selectBox (dieses Bootsstraphelper HTML, String -ID, Objektwert, String -CSSCLASS, STRING URL, STRING -Param, String Textfield, String ValueField, BOOL Multiple = False) {Tagbuilder = New Tagbuilder = New Tagbuilders Tagbuwerer ("; tag.addcssClass ("Form-kontroll"); if (! string.isnullorempy (id)) {Tag.Mergeattribute ("id", id); } if (value! } if (! string.isnullorEmpty (CSSCASS)) {Tag.AddcssClass (CSSSClass); } if (! string.isnullorEmpty (url)) {Tag.Mergeattribute ("Data-URL", URL); } if (! string.isnullorEmpty (param)) {Tag.Mergeattribute ("data-param", param); } if (! string.isnullorEmpty (param)) {Tag.Mergeattribute ("data-param", param); } if (! string.isnullorEmpty (ValueField)) {Tag.Mergeattribute ("Datenwertfeldfeld", ValueField); } if (! string.isnullorEmpty (textField)) {Tag.Mergeattribute ("Data-Text-Feld", TextField); } if (multiple) {tag.mergattribute ("multiple", "multiple"); } return mvchtmlstring.create (tag.toString ()); }}}Anschließend verwendet das Front-End JS, um zu initialisieren, und es muss ein JS-Datei Utility.combobox.js geben:
(Funktion ($) {// 1. Definieren Sie JQuery -Erweiterungsmethoden Combobox $ .fn.combobox = Funktion (Optionen, Param) {if (Typofoptionen == 'String') {return $ .fn.combobox.methods [option] (this, param);} // 2. $. Option.Text (Option.PlaceHolder); options.onBeforeLoad.call (Ziel, parat); item) {var option = $ ('<option> </option>'); option.onchange (target.val ()); $ .getJson (url, function (data) {jq.empty (); var option = $ ('<option> </option>'); option.attr ('value', ''); option.text ('bitte auswählen'); jq.append (option); $. item [jq.attr ('valueField']); }}; // 6. Default parameter list $.fn.combobox.defaults = { url: null, param: null, data: null, valueField: 'value', textField: 'text', placeholder: 'Please select', onBeforeLoad: function (param) { }, onLoadSuccess: function () { }, onChange: function (value) { } }; // Dieser Absatz ist neu hinzugefügt und die Initialisierungsmethode $ (Dokument) .ready (function () {$ ('select'). Jede (Funktion () {var $ combobox = $ (this);Diese JS -Datei stammt aus einem früheren Artikel des Bloggers //www.vevb.com/article/92595.htm
Dann der Front-End-Anruf
<div> @bootstrap.selectbox ("sel", null, null, "/home/getDept", null, "name", "id") </div>5. Zusammenfassung
Zu diesem Zeitpunkt wurde die erste Version unseres Bootstruphelper im Grunde genommen abgeschlossen, und die Hauptpaketkomponenten sind wie folgt:
Natürlich mag jeder den Quellcode, der am meisten freigeht. Quellcodeadresse
Wenn Sie der Meinung sind, dass dieser Artikel Ihnen helfen kann, empfehlen Sie ihn bitte.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.