2017-05-08 3 views
0

Ich habe eine Aktion, die ein komplexes Objekt als Eingabe nimmt. Ich möchte in der Lage sein, einen der Werte entweder mit POST-Daten oder mit der Abfragezeichenfolge in einer GET-Anforderung zu füllen. Das funktioniert gut.MVC5 - Wie man weiß, ob eine Aktionseingabe vollständig leer war

Ich möchte auch einen Standardwert bereitstellen, wenn keine Benutzereingabe bereitgestellt wurde, jedoch funktioniert dies nicht, da der Filter nie null ist, auch wenn keine querystring-Parameter von einer GET-Anforderung vorhanden waren. Was stattdessen passiert, ist, MVC ruft nur den Standardkonstruktor des Modells auf, ohne irgendwelche Eigenschaften zu setzen, anstatt mir eine Null zu geben.

 public ActionResult Index(DataFilterInput filter = null) 
     { 
      if (filter == null) 
       filter = new DataFilterInput { Top = 100 }; 
      var model = new IndexModel(); 
      return View(model); 
     } 

Wie kann ich wissen, ob ich die Werte in Abwesenheit von Benutzereingaben in Verzug sein sollte (ich will nicht in die Anfrage Query-String oder Formularsammlungen gehen)?

+0

Kontrollmodellzustand mit und schauen Sie in Datenattribute – Nkosi

+0

@Nkosi, können Sie bitte ein wenig mehr Details liefern und senden diese als Antwort anstelle eines Kommentars? – TheCatWhisperer

+0

Haben Sie das '[DefaultValue (null)]' Attribut vor der Parameterdeklaration anstelle von '= null' versucht? Ich frage mich, ob das das Verhalten ändern würde. –

Antwort

0

einen Standardwert für das Objekt zu schaffen, diese Probe

public class SearchModel 
{ 
    public bool IsMarried{ get; set; } 


public SearchModel() 
    { 
    IsMarried= true; 
    } 
} 

funktionieren würde und wenn Sie überprüfen möchten das Modell

public ActionResult Index(DataFilterInput filter = null) 
     { 
     if (!ModelState.Isvalied) 
       filter = new DataFilterInput { Top = 100 }; 
      var model = new IndexModel(); 
      return View(model); 
     } 
+0

Was ist, wenn ich dieses Ansichtsmodell mehrere Orte verwende und unterschiedliche Standardeinstellungen in verschiedenen Aktionen möchte? Das Problem mit dieser Antwort ist, dass sie für jeden gilt, der den Standardkonstruktor – TheCatWhisperer

+0

verwendet. Sie sollten ein Modell erstellen und Ihr Ansichtsmodell mit dem Standardkonstruktor anpassen, wenn Sie es als Objekt verwenden. – AlameerAshraf

+0

Es kann nur einen Standardkonstruktor geben – TheCatWhisperer

0

Sie oben nullable

public int? Top {get;set;} 

DeCare Wenn kein Top-Wert angegeben wird, ist dies standardmäßig null und Sie können es durch ==null oder HasValue wie diese

public ActionResult Index(DataFilterInput filter) 
    { 
    if (!filter.Top.HasValue) 
     filter = new DataFilterInput { Top = 100 }; 
    var model = new IndexModel(); 
    return View(model); 
    } 
+0

Top ist bereits Nullable. Das ist ein gültiger Status, da jemand Informationen über eine bestimmte Entität anstelle der obersten – TheCatWhisperer

+0

@TheCatWhisperer anfordern kann, dann sollten Sie alle gültigen Eigenschaften "nullable" und die Bedingung als 'filter.Top.HasValue && filter.property1.HasValue prüfen && filter.property2.HasValue' – Usman

+0

Das ist keine wartbare Lösung. – TheCatWhisperer

Verwandte Themen