Laden...

[gelöst][ASP.NET MVC] ReadOnly TextBox an Property binden

Erstellt von kunsti vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.479 Views
K
kunsti Themenstarter:in
89 Beiträge seit 2013
vor 9 Jahren
[gelöst][ASP.NET MVC] ReadOnly TextBox an Property binden

Hi,
ich versuche aktuell ein Projekt in ASP.NET MVC umzusetzen.
Nun versuche ich eine Read-Only TextBox zu erzeugen. Das hat auch schon geklappt.
Allerdings wird der Wert der Property nicht daran gebunden, wie ich es mir erhofft habe.

So erstelle ich die TextBox:

 @Html.TextBoxFor( model => model.Gates[0].Status, null, new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" } )

Mein Model sieht wie folgt aus:
Ja die Liste macht aktuell noch nicht wirklich sinn, da ich aktuell erst mal nur die Benutzeroberfläche aufbaue und die Logik nur Testdaten zurückgeben lasse.


	public class GatesModel
	{
		public List<Gate> Gates{
			get
			{
				return new List<Gate>(){
					new Gate("XX.XX.XX.XX")
				};
			}		
		}
	}

Die Property Status von Gate liefert lediglich einen Enumwert zurück.
Meine Fragen sind nun:
1.Wie schaffe ich es, dass der Wert des ersten Gates automatisch an die Textbox gebunden wird.
2.Ist es möglich die Property in einem bestimtmen Zeitraum wieder zu überprüfen, dass die Textbox sich automatisch aktualisiert?

Danke und Viele Grüße

16.834 Beiträge seit 2008
vor 9 Jahren

1.Wie schaffe ich es, dass der Wert des ersten Gates automatisch an die Textbox gebunden wird.

Nimm ein ViewModel Element, das dies auch repräsentiert und arbeite nicht mit einem Index.
Denn so funktionieren Collections in HTML nicht.

Ist es möglich die Property in einem bestimtmen Zeitraum wieder zu überprüfen, dass die Textbox sich automatisch aktualisiert?

Nicht mit Server-Technologien.

ASP.NET MVC ist eine reine Server-Technologie.
Wenn Du im Prinzip eine SPA willst, was 90% aller neuen Webanwendungen darstellen, dann bist Du mit ASP.NET MVC auf dem falschen Weg.
ASP.NET MVC ist zwar sehr modern, aber gehört nicht mehr zur neuesten Generation von RIAs.

Wenn Du eine neue Applikation schreibst würde ich mir zwei mal überlegen, ob ich für die Interaktion mit dem Anwender noch ASP.NET MVC verwende.
Und ich war mal ein absolute Verfechter 😉

K
kunsti Themenstarter:in
89 Beiträge seit 2013
vor 9 Jahren

Danke für die Antwort.
Habe ich das richtig verstanden, dass ich das so machen soll?


	public class GatesModel
	{
	public string MyProperty { get { return "Test"; }  }
         }
	}
 @Html.TextBoxFor( model => model.MyProperty, null, new { size = "10", @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" } )

Denn so funktioniert es nicht. Die TextBox ist weiterhin leer.

16.834 Beiträge seit 2008
vor 9 Jahren

Wenn ich Dir ne Empfehlung geben kann, was Du tun "sollst", dann lass die (bescheuerten) HTML Helper weg und nimm raw HTML.

K
kunsti Themenstarter:in
89 Beiträge seit 2013
vor 9 Jahren

Das habe ich auch gerade versucht. Das ertsellen der Textbox klappt auch. nun habe ich versucht den Wert zu binden, aber irgendwas mache ich falsch.


    <input type="text" value="model => model.MyProperty" readonly disabled size="10"/>
        <input type="text" data-bind="value:gate2Status" readonly disabled size="10" />
        <script type="text/javascript">
    var viewModel = {
        gate2Status:"Status"
    };
        </script>

Die erste Textbox erkennt den string auch als string an und nicht als DataBinding, also stehtd er Lambda-Ausdruck in der Textbox.
Bei der zweiten Textbox erscheint kein Text in der TextBox, ich dachte da würde "Status" erscheinen. Wenn das geklappt hätte hätte ich versucht den Wert der Property abzurufen.

16.834 Beiträge seit 2008
vor 9 Jahren

Was soll der Code werden?
Wieso versuchst Du Client-Side-Binding mit einer Server-Technologie abzubilden?

K
kunsti Themenstarter:in
89 Beiträge seit 2013
vor 9 Jahren

Was soll der Code werden?

Wie meinst du das?
Was es für eine Anwendung werden soll?
Der User soll Tore steuern können. Aus diesem Grund soll pro Tor zwei Buttons geben (Öffnen und Schließen). In einer TextBox soll der Status des Tores angezeigt werden und damit habe ich aktuell propleme.

Ich dachte, da ich es in den Views versuche bin ich auf der Client Seite, oder habe ich da was falsch verstanden?

16.834 Beiträge seit 2008
vor 9 Jahren

Ich glaube Dir fehlen da ziemlich gewaltig die Grundlagen von HTML bzw HTTP, kann das sein?Offensichtlich verstehst Du eher nicht die Trennung von Server und Client. 😉

Du kannst an den Client erst mal nur HTML schicken.Ergo musst Du mit Hilfe von ASP.NET ein HTML generieren, was der Client versteht. Den Ansatz hattest Du mit den HTML-Helpern; jetzt kommst Du aber plötzlich mit Client Binding an. 🤔
Entweder Du setzt das mit dem 1-2 Generationen alten ASP.NET MVC und Razor an und bildest dort sauber das HTML ab (besser ohne diese Helper) oder Du schaust Dir mal das Thema AngularJS, wo Client Binding dann richtig wäre.

So musst Du erst mal erreichen, dass Du sauberen HTML Code erstellst; und das funktioniert nicht mit stupiden Copy-Paste von Lambda-Ausdrücken.
Das würde der Client eh nicht verstehen.

<input type="text" value="@(Model.PropertyValue)" readonly disabled size="10"/>
<input type="text" value="@(Model.Status)"  readonly disabled size="10" />

PS: Dein HTML ist nicht HTML5, wenn das dein Ziel sein sollte. ⚠

K
kunsti Themenstarter:in
89 Beiträge seit 2013
vor 9 Jahren

Den Ansatz hattest Du mit den HTML-Helpern; jetzt kommst Du aber plötzlich mit Client Binding an. 🤔

Dachte dass ich der View ja irgendwie mitteilen muss, was sie anzeigen soll.

Leider fehlt hier das Smiley, welches sich auf den Tisch haut...
Was ein dummer Fehler. Ich hab in meinem Controller die View einfach so zurückgegeben.
Dadurch kannte die View das Model nicht und konnte dann halt dementsprechend auch nicht die Daten anzeigen...

Danke für deine Hilfe..

16.834 Beiträge seit 2008
vor 9 Jahren

Verwende immer den vollständigen Pfad in der Übergabe

return View("..path/..to/../View.cshtml", Model);

Es ist nicht nur schneller in der Ausführung; es lädt auch immer genau die View, die man laden will und nicht eine andere mit zufällig dem identischen Namen.

K
kunsti Themenstarter:in
89 Beiträge seit 2013
vor 9 Jahren

Danke für den Hinweis