2013-04-26 9 views
5

Chciałbym lepiej zrozumieć, w jaki sposób metoda kontrolera wie, kiedy parametr, który otrzyma, powinien zostać pobrany z danych pocztowych lub adresu URL.ASP.NET MVC: W jaki sposób kontroler rozróżnia parametry w adresie URL i wysyła POST

Weźmy następujący przykład:

URL: /ModelController/Method/itemID 
// Where itemID is the id (int) of the item in the database 
POST: objectOrArray: {JSON Object/Array} 

Kontroler będzie wyglądać następująco:

[HttpPost] 
public ActionResult InputResources(int? id, Object objectOrArray) 

Teraz jakoś metoda jest wystarczająco inteligentny, aby spojrzeć na pierwszym parametrze, id, w adres URL strony i Object w HTTPPost.

Podczas gdy to działa, nie wiem dlaczego, w wyniku czego czasami wpadam w nieprzewidywalne i błędne zachowanie. Na przykład, znalazłem (chociaż nie jestem w 100% pewny), że usunięcie ? z int? id powoduje, że metoda kontrolera natychmiast zakłada, że ​​powinna szukać id w HTTPPost, a nie w adresie URL.

Więc chciałbym wyjaśnić następujące kwestie:

co dokładnie jest to, że mówi metodę gdzie szukać danych? (Atrybut [HttpPost] wyklucza metodę?)

Czy obowiązują konwencje nazewnictwa? (na przykład usuń ? lub nie używając id jako nazwy zmiennej?)

Czy kolejność, w jakiej są umieszczane zmienne, ma wartość inpact? (tj. umieszczenie Object przed) w przekonaniu, że mogę mniej lub bardziej rozgryźć niektóre z tych rzeczy metodą prób i błędów, ale chciałbym raczej wyjaśnienia kwalifikowanego, niż kontynuowania pracy opartej na obserwacji.

Dziękuję

Chopo

Odpowiedz

5

Spójrz na trasy domyślnej od Global.asax:

routes.MapRoute(
    "Default",            
    "{controller}/{action}/{id}",      
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

Pierwszą rzeczą, że MVC będzie próbował zrobić to mapować parametry metoda wartości w STANOWISKO. Jeśli nie znajdzie dopasowania, przejdzie przez inne możliwości, w tym wartości trasy.

Oto kolejność spoiwo modelu wykorzystuje:

  1. Wcześniej związany parametry działania, gdy działanie jest działaniem dziecko
  2. Pola formularzy (Request.Form)
  3. wartości właściwości w Treść żądania JSON (Request.InputStream), ale tylko wtedy, gdy żądanie jest żądaniem AJAX.
  4. Dane trasy (RouteData.Values)
  5. Parametry kwerendy rs (Request.QueryString)
  6. Opublikowane pliki (Request.Pliki)

Powodem, dla którego obserwujesz zachowanie, które opisujesz, jest to, że dane POST pojawiają się przed wartościami trasy. Wygląda na to, że MVC nie może powiązać wartości int do wartości POST, więc pomija ją i kontynuuje, dopóki nie osiągnie mapowania RouteData, w którym to momencie odnajduje dopasowanie i pobiera wartość z trasy. Gdy parametr staje się nie-nullable, jest on nagle w stanie powiązać go z wartością POST, która ma wyższy priorytet niż RouteData, więc robi to.

Źródło: http://msdn.microsoft.com/en-us/magazine/hh781022.aspx

+0

Dziękuję, świetna odpowiedź. Udostępniono również doskonałe źródło informacji – Chopo87

Powiązane problemy