Laden...

Html Helper überimmt leere String-Werte nicht

Erstellt von Abt vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.270 Views
Abt Themenstarter:in
16.835 Beiträge seit 2008
vor 13 Jahren
Html Helper überimmt leere String-Werte nicht

Guten Tag,

ich lasse über die Html UI Helper meine Forms ausfüllen, um so direkt ein Objekt beim Controller zu bekommen.

Mein ViewModel ist (relevanten Daten):


public FormViewModel( )
{
    this.Version = string.Empty;
    this.HmiVersionString = string.Empty;
    this.MmcVersionString = string.Empty;
}

[DefaultValue( "" )]
public string HmiVersionString { get; set; }

[DefaultValue( "" )]
public string MmcVersionString { get; set; }


Ich setze also allen vorhandenen String-Properties automatisch den Wert string.Empty zu.
Im Konstruktor setze ich sie eigentlich nicht, sondern aufgrund des aktuellen Problems eingefügt.

Das ganze Funktioniert auch, wenn ich ein Objekt im Controller erstelle - die Werte sind alle string.Empty.

Nun fülle ich die Form mit Hilfe von:



<%: Html.Hidden( "Version", Model.Version ) %>
<%: Html.Hidden( "HmiVersionString", Model.HmiVersionString )%>
<%: Html.Hidden( "MmcVersionString", Model.MmcVersionString  )%>

Wenn ich nun den generierten HTML Code im Browser so anschaue, dann sehe ich auch mein Objekt mit der MmcVersionString Variable und dessen Value "".

Schicke ich die Form nun ab und schaue mir das Objekt an, ist MmcVersionString :::

Ich kann mir leider einfach nicht erklären, wieso der Wer null ist.
Ist der Inhalt nicht string.Empty, sondern enthält einen gefüllten String, wird dieser auch korrekt übernommen.

Vielleicht kann mich jemand in dieser Sache aufklären, wieso das so ist und wie ich das lösen kann, ohne auf null prüfen zu müssen, sondern die leeren Werte korrekt übernommen werden.

Edit:
es scheint wirklich so zu sein, dass der Konstruktor nicht aufgerufen wird.
Auch eine weitere int-Property, die im Konstruktur auf 2 gesetzt wird, ist direkt beim Controller auf 0.

Edit 2:
Der Konstruktor wird aufgerufen, aber es wird definitiv der Standardwert des jeweiligen Typs aktiv gesetzt, sprich 0 für int und null für den string - wieso auch immer.

Grüße vom Abt

C
24 Beiträge seit 2009
vor 13 Jahren

Hallo,

Es werden bei Übertragung des Formulars nur gesetzte Werte berücksichtigt und folgende ignoriert, bzw. "vergessen" zu übertragen:
*Eingabefelder ohne Wert (darunter auch explizit mit value="") gekennzeichnete *CheckBoxen ohne Häkchen, o.ä. *deaktivierte Html-Elemente

asp.net mvc macht beim Seitenaufruf folgendes:

  1. Bei Aufruf der Controller-Funktion ermitteln was für eine Klasse erwartet wird.
  2. Ein Objekt der Klasse initialisieren (hier wird bei dir DefaultValue(""), bzw. im Konstruktor string.Empty gesetzt)
  3. Die Post/Get-Daten auswerten und das Objekt mit Daten befüllen (Da ein leeres Textfeld nicht in den Post/Get-Daten vorhanden ist, wird null gesetzt und dein DefaultValue somit überschrieben).

Da der Debugger nicht in Punkt 1-3 hineinspringt (es sei denn du setzt in deiner Klasse einen Breakpoint) siehst du auch nicht die Änderung des Wertes und gehst davon aus, dass direkt null gesetzt wurde.

@Edit:
Wenn du verhindern willst dass null gesetzt wird, musst du die set-Methode deiner Eigenschaften überschreiben.

Abt Themenstarter:in
16.835 Beiträge seit 2008
vor 13 Jahren

Hallo Chris,

danke für Deine Erklärung, die ich so auch bisher ja nachvollziehen kann.

Im Moment helfe ich mir mit folgendermaßen:

private string _hmiVersionString = string.Empty;
public string HmiVersionString
{
    get { return this._hmiVersionString; }
    set { _hmiVersionString = value ?? string.Empty; }
}

Ich kann auch im Debugger nachvollziehen, dass beim Konstruktoraufruf die Eigenschaft den Wert string.Empty hat, allerdings null aktiv gesetzt wird.

Soweit hab' ich mich jetzt auch damit abgefunden, dass ich es über diese Variante lösen muss und mir MVC leider meine Default-Werte überschreibt, wenn das Feld leer oder nicht vorhanden ist.
Ich hätte erwartet, dass er die Werte einfach so lässt, sprich die Eigenschaft komplett ignoriert.