2017-06-07 4 views
0

Ich habe ein älteres Projekt (MVC 5.2.2) entstaubt und festgestellt, dass eine meiner DropDownListFor() Verwendungen nicht korrekt funktioniert Wenn die Seite zum ersten Mal als Antwort auf HttpGet Anforderung gerendert wird: generierter HTML-Code enthält kein ausgewähltes Attribut überhaupt.DropDownListFor() wählt nicht erforderliches Element bei Abrufanforderung (bei Postanforderung funktioniert)

Wenn ich Ansicht Modell heißt Select Artikel (in der Steuerung und int die gerenderte Ansicht) inspizieren, das gewünschte Element hat Mitglied Satz auf true ausgewählt. Artikel Id ist enum Wert.

Wenn die gleiche Seite als Antwort auf HttpPost Anfrage gerendert wird, funktioniert alles OK. Das Schlimmste ist, wenn das Modell die Kontrolle, die Werte sind die gleichen wie auf HttpGet Anfrage und SelectLists sind in beiden Fällen die gleiche Routine ...

erstellt

Statt mit Enum als ausgewählte Element Id I versuchte eine Instanz des vollständigen Artikels für ausgewählte wie in der answer here mit dem gleichen Ergebnis: funktioniert nicht auf HttpGet.

Die Liste ist auf diese Weise aufgebaut:

List<CashType> types; 
    if (AIncludeAll) 
    types = ADbContext.CashTypes.OrderBy(c => c.Ident).ToList(); 
    else 
    types = ADbContext.CashTypes.Where(c => c.Id != CashTypeValues.All).OrderBy(c => c.Ident).ToList(); 
    // 
    foreach (var type in types) 
    type.Translation = CashTypeValueToDescription(type.Id); 
    return new SelectList(types, "Id", "Translation", ACashType); 

CashType kommt von DB-Modell:

[Key] 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)] 
public CashTypeValues Id { get; set; } 

[Required] 
[StringLength(DBDomains.D_IDENTCODE)] 
[Index(IsUnique = true)] 
public string Ident { get; set; } 

[NotMapped] 
public string Translation { get; set; } 

Ansicht Modell

[Display(Name = "View_Unit_CashType", ResourceType = typeof(WebGui))] 
public CashTypeValues CashType { get; set; } 
public SelectList CashTypes { get; set; } 

ist schließlich, den Einsatz in Razor wie folgt aussieht:

<div class="Theme-Bottom-Filter-Field"> 
    @Html.LabelFor(m => m.CashType) 
    @Html.DropDownListFor(m => m.CashType, Model.CashTypes, new { Id = "CashTypeSelector" }) 
</div> 

Hat jemand eine Idee, was ich vermisse?

Thanx, pf

+0

in meiner Erfahrung in der Liste ausgewählt wird ignoriert. Stellen Sie sicher, dass der Wert von CashType dem entspricht, was Sie auswählen möchten –

+0

Der CashType-Wert ist gleich mit item.Id, das ich auswählen möchte. – pf1957

Antwort

1

Die Tatsache, dass Selected wahr ist auf der SelectListItem belanglos ist. Wenn Razor die Dropdown-Liste rendert, wird der ausgewählte Wert basierend auf ModelState festgelegt. Wenn also der richtige Wert nicht ausgewählt wird, bedeutet dies, dass der richtige Wert in ModelState nicht existiert.

ModelState besteht aus Werten von Request, ViewData/ViewBag und schließlich Model. Im Allgemeinen möchten Sie lediglich sicherstellen, dass das Modell, das Sie an die Ansicht übergeben, über den entsprechenden Wert verfügt. Wenn Sie die Eigenschaft auf Ihrem View-Modell einen Standardwert haben soll, zum Beispiel, können Sie tun:

private CashTypeValues? cashType; 
public CashTypeValues CashType 
{ 
    get { return cashType ?? CashTypeValues.Default; } 
    set { cashType = value; } 
} 

Oder in C# 6+:

public CashTypeValues CashType { get; set; } = CashTypeValues.Default; 

Da jedoch Werte in Request und ViewData/ViewBag haben Vorrang, Sie müssen sicherstellen, dass Sie auf diese Weise keinen falschen Wert übergeben.Wenn Sie zum Beispiel eine Abfragezeichenfolge wie ?cashType=foo hätten, wäre der ausgewählte Wert "foo" und nicht das, was Sie ursprünglich an Ihrem Modell hatten. Sie sollten auch vermeiden, etwas wie ViewBag.CashType zu setzen. Es ist auch wichtig zu beachten, dass in allen diesen Fällen die Groß-/Kleinschreibung nicht beachtet wird. Wenn es um ModelState geht, foo == FOO == Foo == fOO.

+0

Sie haben Recht: Query String mit dem gleichen Namen als Teil von HttpGet URL ist das Böse. Ich musste Standardwerte an das übergeordnete Modell/View übergeben und sie in die Abfragezeichenfolge einfügen, um dieses seltsame Verhalten zu vermeiden: Warum rendert der Renderer nicht einfach das geantwortet Modell und kümmert sich um Eingabewerte, die nicht sein Geschäft sein sollten :-(Wie auch immer, danke für die schnelle und nützliche Antwort. – pf1957

Verwandte Themen