2 Stimmen

ASP.NET MVC-Validierung

Ich habe 2 Szenarien, die ich brauche etwas Hilfe mit re Validierung in meinem ASP.NET MVC-Anwendung. Ich bin mir bewusst, dass mit Validierung innerhalb des Controllers nicht ideal ist, so bin auf der Suche, um diese anderswo zu halten - vielleicht mit meinen Modellen, wo ich kann.

1) Ich habe ein Modell mit verschiedenen Eigenschaften, von denen einige Validierung gegen sie mit DataAnnotations haben. Ich bin dann mit der Html-Hilfsmethoden innerhalb meiner Ansicht, um alle Validierungsfehler gegen die relevanten Felder aufzudecken. Für den größten Teil, diese Arbeit wie erwartet. Die Ausnahme, die ich habe, ist, wo eines der Felder in meiner Ansicht eine Dropdown-Liste ist. Das erste Element in meiner Liste ist leer/leer, der Rest sind echte Werte. Die Eigenschaft in meinem Modell, dass dieses Feld bezieht sich auf die folgenden gegen sie hat:

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

Derzeit, wenn ich den Standardwert in der Liste (leer) und nicht wählen Sie einen echten Wert aus der Liste, ich möchte es die Validierung Fehlermeldung zu machen, aber es ist derzeit behandeln es, als ob es ein gültiger Wert waren, und die Validierung übergeben.

Wie kann ich erreichen, dass die Validierung fehlschlägt, wenn das leere Listenelement übermittelt wird?

2) In einer meiner Ansichten habe ich einige Steuerelemente zum Hochladen von Dateien, mit denen der Benutzer Bilder auf die Website hochladen kann. Diese Felder sind nicht direkt an irgendwelche Eigenschaften innerhalb meines Modells gebunden - nur die resultierenden Dateinamen (sobald die Datei hochgeladen, konvertiert, umbenannt usw.) werden dann den Eigenschaften "Dateiname1", "Dateiname2" usw. innerhalb meines Modells zugewiesen.

Ich frage mich also, wie ich am besten überprüfen kann, dass diese obligatorischen Dateien hochgeladen werden? Derzeit tue ich das folgende für jede der Dateiupload-Steuerelemente, innerhalb meiner Controller(!):

HttpPostedFileBase file = null;

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

Sobald dies für jedes der Dateiupload-Steuerelemente geschehen ist, prüfe ich, ob der ModelState gültig ist:

if (ModelState.IsValid)

Ich bin sicher, dass es eine bessere Möglichkeit gibt, diese Validierung durchzuführen, und ich könnte mir vorstellen, dass es nicht ideal ist, dies im Controller zu haben, aber ich bin mir nicht sicher, wie man dies am besten handhabt.

Ich wäre für jede Hilfe bei diesen 2 Szenarien dankbar.

0voto

amurra Punkte 14781

Für #1, was ist der Wert, der für die Dropdown-Liste gebucht wird, und was ist der Typ in Ihrem Modell, das es versucht, gegen zu binden? Wenn es einen Wert wie " " angibt, wird die Validierung bestanden. Sie müssen sicherstellen, dass es ein leerer String ist, wenn Ihr Typ ein String ist.

Für Nr. 2 könnten Sie versuchen, einen benutzerdefinierten Modellbinder zu schreiben, aber ich bin nicht sicher, wie hässlich das wäre, um Zugriff auf die Dateien zu erhalten. Eine andere Möglichkeit ist, es Teil Ihrer Parameter auf die Aktion Ergebnis zu machen:

public ActionResult Test(TestModel model, HttpPostedFileBase files)

Dies wird zumindest die automatische Bindung für Sie tun, wenn eine Datei vorhanden ist, aber Sie müssten immer noch die manuelle Validierung durchführen, wie Sie zuvor tun würde. Ich weiß, es ist nicht die genaue Antwort, die Sie suchen, aber es bereinigt den Dateicode ein wenig mehr.

Auch diese Frage könnte ein wenig weiterhelfen: ASP.NET MVC posted file model binding wenn der Parameter Model ist

0voto

kerrubin Punkte 1556

Hier ist mein Code (Erläuterungen später) :

Das Formular:

<% 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, wird Ihr Modell nicht gültig sein.

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

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

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

Ich weiß nicht, ob es eine "gute Sache" ist, aber es funktioniert ziemlich gut :)

0voto

Ajay Rathi Punkte 24

Es scheint, als würden Sie mit ASP.net Dynamic data arbeiten. Wenn ja, ASP.Net Dynamische Daten arbeiten auf das Konzept Modul Ansichtssteuerung.

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

Top behandeln diese sollten Sie ein neues Steuerelement erstellen und tun die Validierung in diesem Steuerelement und in der Klasse für diese Spalte können Sie angeben, dass es Ihre benutzerdefinierte Steuerung verwenden sollte.

Bitte lassen Sie mich wissen, wenn Sie weitere Einzelheiten zur Anpassung der Steuerung benötigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X