2016-05-12 7 views
1

Ich entwickle eine Anwendung in der ASP.NETMVCC# auf der .NET 4 Rahmen.C# MVC - Routing Problem/Verwirrung

Ich verwirrt in routing und ich mache die Forschung und entwickelte die eine Demo-Version Es funktioniert, wie ich will, aber ich möchte wissen, welche Methode Best Practice für die Entwicklung von Anwendungen ist.

Zuerst registrieren ich die Route wie folgt aus:

routes.MapRoute(
       name: "RoutesTesting", 
       url: "{controller}/{action}/{a}/{b}/{c}/{d}/{e}", 
       defaults: new { controller = "Home", action = "Test", e = UrlParameter.Optional } 
       ); 

ich eine Klasse, die die Eigenschaften haben, und es ist Name identisch mit dem Parameter der Route.

class MyClass{ 
    public string a{get;set;} 
    public string b{get;set;} 
    public string c{get;set;} 
    public string d{get;set;} 
    public string e{get;set;} 
} 

Jetzt habe ich die Tow-Methoden erstellt, die funktioniert finden und die Daten von der URL erfolgreich erhalten.

Methode 1:

public ActionResult Test(MyClass objMyClass){ 

} 

Methode 2:

public ActionResult Test(string a,string b,string c,string d,string e=String.Empty){ 

} 

Meine Frage ist:

  1. routet das Gespräch in meiner Aktionsmethode zu tun? Wie konvertiert er die Parameterwerte in den Eigenschaften des MyClass-Objekts?

  2. Welche Methode wird empfohlen?

  3. Wird Methode 1 einen Fehler oder eine Ausnahme auslösen, wenn die Konversation nicht möglich ist?

Vielen Dank im Voraus ...

+0

Ich glaube, ich habe noch nie eine gute URL mit so vielen '/' gesehen. Methode 2 ist das, was ich normalerweise für eine Route verwenden würde. Ich würde nur Methode 1 für einen POST eines Modells zurück zum Server verwenden. –

+0

Okay Danke @AshleyMedway. Die Methode 2 ist also gut zu benutzen. –

+0

Nun, wenn beide funktionieren, kannst du benutzen, was immer du willst ... –

Antwort

1

Das Verhalten, das Sie sehen, ist ein Teil der Modellbindung von ASP.NET.Es ist die Magie, die Sie über ein JSON-Objekt von {"firstName":"Jonathon","lastName":"Chase"} senden kann und haben automatisch zu einem Modell Person zugeordnet werden, die aussieht wie so:

public class Person { 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 

Die Tatsache, dass Sie eine Route wie das schaffen können, ist nur eine Folge von Dies. Model Binding ist ein komplexes Thema, aber ich kann einige Aspekte der Gestaltung Ihrer Route ansprechen, insbesondere wenn die von Ihnen erstellte Aktion einen Nebeneffekt hat, z. B. das Schreiben in eine Datenbank.

Wenn Sie eine Methode verwenden, die den Status beeinflusst, sollten Sie ein anderes Http-Verb als Get verwenden und das Modell im Körper der Anfrage anstatt in der Abfrage/URL-Zeichenfolge senden. Das Model Binding wird sich um das Mapping kümmern.

Sie sollten lieber ein starkes Modell anstelle von mehreren Grundelementen als Parameter verwenden, insbesondere in Fällen, in denen die Informationen im Hauptteil einer Anforderung über die Abfragezeichenfolge gesendet werden.

Diese Punkte sind jedoch strittig und sollten in den meisten Fällen nicht als harte oder schnelle Regeln betrachtet werden.

Zu dem letzten Punkt, wenn die Parameter nicht korrekt genug sind, dass die Route die Aktion oder den Controller nicht identifizieren kann, sollten Sie einen 404 erhalten. Wenn Sie jedoch einen Werttyp haben, der nicht als erwartetes Routing zulässig ist Eigenschaft, die nicht ordnungsgemäß gesendet wird, sollten Sie eine 500 mit einer InvalidOperationException erwarten.

+0

Ich habe diesen'Abfrageparameter' verwendet, um Datensätze aus den 'Datenbanken' zu erhalten, und ich habe auch 'Abfrageparameter' in meine Ansicht übernommen, um sie auf dem Bildschirm anzuzeigen. –

+0

Danke Mann, jetzt werde ich mit der "Methode 2" gehen, da deine "Antwort" gesagt hat, dass es sicherer ist, das zu benutzen. –

1

einen Blick auf How model binding works Nehmen

routet das Gespräch in meine Aktionsmethode zu tun? Wie es die Parameterwerte in den Eigenschaften des MyClass-Objekts konvertieren?

Der Framework-Modellbinder führt die Konvertierung basierend auf dem Parameter actions durch.

Welche Methode wird empfohlen?

Das ist eine rechthaberische Frage. Hängt davon ab, welche Ihren Bedürfnissen entspricht. Das Framework behandelt beides.

Wird Methode 1 einen Fehler oder eine Ausnahme auslösen, wenn die Konversation nicht möglich ist?

Modellbinder übergibt null an den Aktionsparameter für die Eigenschaften, die nicht übereinstimmen.

+0

Danke, aber wenn der 'Parameter'-Wert nicht in der Lage ist,' 'matched''-Eigenschaften in' 'zu konvertieren? Was passiert also? –

+0

@ JonathonChase erklärte den letzten Punkt besser in seiner Antwort. – Nkosi