2011-01-06 24 views
2

Ich habe 2 Szenarien, die ich brauche Hilfe mit Re-Validierung in meiner ASP.NET MVC-Anwendung. Ich bin mir bewusst, dass die Validierung innerhalb des Controllers nicht ideal ist, also versuche ich es anderswo zu halten - vielleicht mit meinen Modellen, wo ich kann.ASP.NET MVC Validierung

1) Ich habe ein Modell mit verschiedenen Eigenschaften, von denen einige Validierung haben gegen sie DataAnnotations verwenden. Ich benutze dann die HTML-Hilfsmethoden in meiner Ansicht, um alle Validierungsfehler mit den relevanten Feldern anzuzeigen. In den meisten Fällen funktionieren diese wie erwartet. Die Ausnahme, auf die ich gestoßen bin, ist, wo eines der Felder meiner Ansicht eine Dropdown-Liste ist. Der erste Eintrag in meiner Liste ist leer/leer, der Rest sind echte Werte. Das Anwesen in meinem Modell, das dieses Feld bezieht sich die folgende gegen sie hat:

[Required(ErrorMessage = "A value from the list is required")] 

Derzeit, wenn ich den Standardwert in der Liste (leer) verlassen und keinen echten Wert aus der Liste auswählen, Ich möchte, dass es die Validierungsfehlermeldung rendert, aber es behandelt es gerade, als ob es ein gültiger Wert wäre, und übergibt diese Validierung.

Wie kann ich es Validierung fehl, wenn die leer/leer Listenelement vorgelegt wird?

2) Auf einen meiner Ansichten, ich habe ein paar Datei-Upload-Steuerelemente, den Benutzer ermöglicht, Bilder auf die Website zu. Diese Felder sind nicht direkt an irgendwelche Eigenschaften in meinem Modell gebunden - nur die resultierenden Dateinamen (nachdem die Datei hochgeladen, konvertiert, umbenannt usw. wurde) werden dann den Eigenschaften 'Dateiname1', 'Dateiname2' usw. in meinem Modell zugewiesen.

Also, ich frage mich, wie man am besten über die diese obligatorische Datei-Uploads Validierung gehen? Derzeit mache ich folgendes für jeden des Datei-Upload-Steuerelemente in meinem Controller (!):

HttpPostedFileBase file = null; 

file = Request.Files["Filename1"]; 
     if (file != null && file.ContentLength == 0) 
       ModelState.AddModelError("Filename1", "Image1 is required"); 

Sobald dies für jede der Datei-Upload-Kontrollen durchgeführt wird, ich überprüfen, ob das Model gültig ist:

Ich bin sicher, dass es eine bessere Möglichkeit geben muss, diese Validierung durchzuführen, und ich könnte mir vorstellen, dass es nicht ideal ist, dies in der Steuerung zu haben, aber ich bin mir nicht sicher, der beste Weg, damit umzugehen.

Ich würde jede Hilfe mit diesen 2 Szenarien schätzen.

Antwort

0

Hier mein Code (später Erklärungen) ist:

Die Form:

<% using (Html.BeginForm("TestForm", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { %> 
    <%: Html.DropDownList("ComboboxValue", new SelectList(Model.ComboboxValues)) %><br /> 
    <input type="file" id="FileUpload" name="FileUpload" /><br /> 
    <input type="submit" id="submit" name="submit" value="Valider" /> 
<%} %> 

Das Modell:

public class TestFormModel 
{ 
    [Required(ErrorMessage = "A value from the list is required")] 
    public string ComboboxValue { get; set; } 

    public List<string> ComboboxValues { get; set; } 

    public HttpPostedFileBase FileUpload { get; set; } 

    public ModelStateDictionary IsFileValid() 
    { 
     ModelStateDictionary modelState = new ModelStateDictionary(); 
     modelState.AddModelError("FileUpload", "Here is the problem."); 
     return modelState; 
    } 

Der Controller:

public ActionResult TestForm() 
    { 
     TestFormModel model = new TestFormModel(); 
     model.ComboboxValues = new List<string>(){ 
      "", "Red", "Blue", "Yellow" 
     }; 
     return View("TestForm", model); 
    } 
    [HttpPost] 
    public ActionResult TestForm(TestFormModel model) 
    { 
     model.ComboboxValues = new List<string>(){ 
      "", "Red", "Blue", "Yellow" 
     }; 
     ModelState.Merge(model.IsFileValid()); 
     return View("TestForm", model); 
    } 

1) Wenn Sie einen Nullwert haben, ist Ihr Modell nicht gültig.

2) Um Request.Files ["Dateiname1"] zu vermeiden; Sie können Ihr Formular "schreiben" (new {enctype = "multipart/form-data"}). Damit enthält Ihr Modell die Datei. Sie können eine Erweiterungsmethode, zum Beispiel hinzufügen:

public static bool IsCSVValid(this HttpPostedFileBase file) 
{ 
    return (file != null && file.ContentLength != 0 && file.FileName.EndsWith(".CSV", StringComparison.InvariantCultureIgnoreCase)); 
} 

Und Sie können mit ModelState.Merge() von irgendwo Fehler hinzufügen.

ich weiß nicht, ob es sich um eine „gute Sache zu tun“, aber es funktioniert ziemlich gut :)

0

Für # 1, was ist der Wert, der für die Dropdown-Liste geschrieben wird immer und was ist der Typ in Ihrem Modell, das es gegen zu binden versucht? Wenn es einen Wert wie "" gibt, wird es die Validierung bestehen. Sie müssen sicherstellen, dass es eine leere Zeichenfolge ist, wenn Ihr Typ eine Zeichenfolge ist.

Für # 2, könnten Sie versuchen, ein benutzerdefiniertes Modell Bindemittel zu schreiben, aber nicht sicher, wie hässlich, die den Zugriff auf die Dateien zu bekommen wäre. Eine weitere Möglichkeit ist es Teil Ihrer Parameter auf die Aktion Ergebnis zu machen:

public ActionResult Test(TestModel model, HttpPostedFileBase files) 

Dies wird zumindest tun das Auto für Sie bindend, wenn eine Datei vorhanden ist, aber Sie würden immer noch die manuelle Validierung durchgeführt haben, wie Sie es mach vorher. Ich weiß, es ist nicht die genaue Antwort, die Sie suchen, aber es bereinigt den Dateicode ein wenig mehr.

Auch könnte diese Frage ein wenig mehr helfen: ASP.NET MVC posted file model binding when parameter is Model

0

Es Naht, wie Sie auf ASP.net Dynamische Daten arbeiten. Wenn ja, arbeiten ASP.Net Dynamic-Daten mit dem Konzept Modulansichtssteuerung.

In MVC Das Laden eines Steuerelements für eine Spalte hängt von den Metadaten einer Klasse ab. Es liest den Datentyp der Klasse und lädt dann die Steuerung entsprechend. Wenn Sie Änderungen an diesem Steuerelement vornehmen, wirkt sich dies auch auf andere Bereiche aus.

Top handle das sollten Sie neue Kontrolle erstellen und die Validierung in diesem Steuerelement und in der Klasse für diese Spalte können Sie angeben, dass es Ihre benutzerdefinierten Steuerelement verwenden sollte.

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen zum Anpassen der Steuerung benötigen.

Verwandte Themen