Frage

Es gibt eine Fülle von sehr gutem Beitrag und Erklärungen wie die Validierung mit ASP.NET MVC zu implementieren, und ich ziehe eine davon:

Allerdings habe ich wirklich wie ActionMethods über JQuery $ Schnipsel-Methode aufzurufen. Einer der Gründe, warum ich $ Schnipsel verwenden will, weil es eine Menge von Teilansichten in der Seite dynamisch geladen werden (auch das Formular für die Einheit Schöpfung) über Anrufe $ Schnipsel und ich kann nicht nur die Ansicht zurückkehren - ich werde alle dynamisch geladenen Inhalt verlieren.

Sie eine bessere Sicht auf das Problem geben, ich werde einige einfache Code schreiben zu erklären, wie würde Ich mag Controller nennen Aktionen und Griff Antworten in Client, Jquery-Code.

Die Regler ActionMethod:

    public ActionResult CreateCustomer(string name, string accountNumber)
    {
        try
        {
            CustomerService.InsertCustomer(name, accountNumber);

            return Json(new ActionInfo()
            {
                Success = true,
                Message = "Customer Is Successfully Created"
            });

        }
        catch (Exception ex)
        {
            return Json(new ActionInfo()
            {
                Success = false,
                Message = ex.Message
            });
        }
    }

Der Aufruf und Handling im Client-Code:

$.ajax({
type: "POST",
url: $form.attr('action'),// /MyController/CreateCustomer
data: $form.serialize(),
error: HandleUnespectedError,
dataType: "json",
success: function(response) {

    if (response.Success)
        alert("Success: " + response.Message);
    else
        alert("Error: " + response.Message);
}});

Gibt es eine gute Möglichkeit, einige dieser Validierungsrahmen zu machen, wie ich Notwendigkeit zu arbeiten? Ich weiß, dass ich Validierungsfehler in ActionInfo hinzufügen können, und es dann in Client behandeln, aber das würde sein bereits ein Gebäude meiner einer Validierung, glaube ich.

War es hilfreich?

Lösung

tut Validierung über AJAX unter Verwendung von Daten Anmerkungen Attributen

Ich habe großen Erfolg gehabt. Um die Gültigkeit der Daten zu überprüfen, werden Sie den Controller-ModelState Eigenschaft verwenden, die eine Eigenschaft des eigenen genannt IsValid hat. Ich schlage vor, nachdrücklich empfohlen, einen Blick auf die Daten Anmerkungen Validierung unter Attribute Tutorial von der offiziellen ASP.NET MVC-Website.

Als erstes, mögen Sie Ihre Controller-Aktion ändern Ihr Modell-Objekt als Parameter zu akzeptieren, anstatt eine eigene Namen und Kontonummer. Dadurch wird die Validierung machen Durchführung, die ich weiter unten zeigen wird, viel einfacher. Von Ihrem Beispiel meine beste Vermutung ist, dass Ihr Modell Objekt ist, oder würde, Kunde genannt. Möglicherweise müssen Sie den folgenden Code, um das Modellobjekt und Ihre Controller-Aktion ...

zu definieren,
// model object
public class Customer
{
  public Int32 Id {get; set;}
  public String Name {get; set;}
  public String AccountNumber {get; set;}
}

// controller
public class CustomerController : Controller
{
  public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
  {
     // controller action code
  }
}


Stellen Sie sicher, dass Formularfelder benannt, die Namen der Eigenschaften des Customer-Objekt so ASP.NET MVC binden kann sie automatisch anzupassen. Der „Bind“ -Attribut, in diesem Fall, sagt ASP.NET MVC die „Id“ Eigenschaft der Customer-Klasse zu ignorieren, wenn Formularfelder Modell-Eigenschaften zu binden. Da dies ein neuer Kunde ist, haben wir keine Id noch, so können wir sicher die Id lassen, wie alles, was der Standardwert ist und die Datenschicht verlassen, um herauszufinden, wie sie am besten zu erzeugen.

Wenn der Regler das Modellobjekt für die Aktion-Methode aufgebaut hat, kann seine Gültigkeit leicht über die ModelState.IsValid Eigenschaft überprüft werden. Wie zu erwarten, wird es wahr zurück, wenn die Modell-Eigenschaften gültig sind, oder falsch, wenn eine oder mehr Eigenschaften ungültig sind.

Von der ursprünglichen Frage, scheint es, dass die CustomerService.InsertCustomer Methode Ausnahmen wirft, wenn die Validierung fehlschlägt. Das ist völlig unnötig. Insert sollte nur durchführen müssen, was Datenoperationen notwendig sind für den neuen Datensatz eingefügt wird. Sofern Sie nicht auf abstrakte Implementierung spezifische Ausnahmen wünschen, wie SqlException sollte Insert nicht wirklich zu fangen benötigen oder irgendwelche Ausnahmen werfen, kann aber höchstwahrscheinlich lassen Sie einfach eine beliebige Ausnahmen Blase an den Controller (oder wer auch immer kann der Anrufer sein).

Das Endergebnis all dies könnte eine Controller-Aktion, dass sieht wie folgt sein:

public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
{
  // model is invalid
  if (!ModelState.IsValid)
  {
    return Json(new ActionInfo()
    {
      Success = false,
      Message = "Validation failed" // you will probably want a more robust message :-)
    });
  }

  // service method accepts a Customer object rather than arbitrary strings  
  CustomerService.InsertCustomer(customer);

  return Json(new ActionInfo()
  {
    Success = true,
    Message = "Customer created successfully."
  });

}


Wenn Sie unerwartete Fehler melden, wie Datenbank-Ausnahmen im Zusammenhang, dann können Sie sicher einen try / catch-Block hinzufügen, um den Anruf zu Insert, und senden Sie das notwendige Ergebnis für die Anzeige der Fehlermeldung an den Client zurück.

Andere Tipps

Das ist mehr als ein Jahr, nachdem Sie Ihre Frage gestellt haben, aber ich habe serverseitige Validierung abgedeckt mit Ajax-Aufrufen in meinem

scroll top