ASP.NET MVC Kullanarak Birden Çok Parametreyle Yönlendirme


139

Şirketimiz ürünlerimiz için bir API geliştiriyor ve ASP.NET MVC kullanmayı düşünüyoruz. API'mızı tasarlarken, kullanıcının API'dan XML biçiminde bilgi istemesi için aşağıdaki gibi çağrıları kullanmaya karar verdik:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&api_key=b25b959554ed76058ac220b7b2e0a026

Gördüğünüz gibi, birden fazla parametre iletilir (yani artistve api_key). ASP.NET MVC, artistolurdu controller, getImageseylem, ama nasıl eyleme birden çok parametre geçerdi?

Yukarıdaki formatı kullanarak bu mümkün müdür?

Yanıtlar:


279

İşlem yöntemlerinize parametreler ekleyerek parametreler doğrudan MVC'de desteklenir. Aşağıdaki gibi bir eylem verildi:

public ActionResult GetImages(string artistName, string apiKey)

MVC, aşağıdaki gibi bir URL verildiğinde parametreleri otomatik olarak doldurur:

/Artist/GetImages/?artistName=cher&apiKey=XXX

Ek bir özel durum "id" adlı parametrelerdir. ID adındaki herhangi bir parametre querystring yerine yola konabilir, bu nedenle:

public ActionResult GetImages(string id, string apiKey)

aşağıdaki gibi bir URL ile doğru şekilde doldurulur:

/Artist/GetImages/cher?apiKey=XXX

Ayrıca, daha karmaşık senaryolarınız varsa, MVC'nin bir eylemi bulmak için kullandığı yönlendirme kurallarını özelleştirebilirsiniz. Global.asax dosyanız, özelleştirilebilen yönlendirme kuralları içeriyor. Varsayılan olarak kural şuna benzer:

routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

Aşağıdaki gibi bir URL'yi desteklemek istiyorsanız

/Artist/GetImages/cher/api-key

aşağıdaki gibi bir rota ekleyebilirsiniz:

routes.MapRoute(
            "ArtistImages",                                              // Route name
            "{controller}/{action}/{artistName}/{apikey}",                           // URL with parameters
            new { controller = "Home", action = "Index", artistName = "", apikey = "" }  // Parameter defaults
        );

ve yukarıdaki ilk örnek gibi bir yöntem.


1
.NET 4 ve MVC ile çalışıyorum. Yolda sadece bir parametre iletebilirim. Bu URL {denetleyici} / {eylem} / {sanatçıAdı} / {apikey} benim için 2 parametreye eşlenmiyor, ancak bir 404 hatasını tetikliyor. Söyleyebildiğim kadarıyla yolda sadece 1 parametre geçirebilirsiniz. Neyi yanlış yapıyorum?
DavidHyogo

1
@DavidHyogo - Aynı sorunu yaşıyordum. Herhangi bir nedenle, varsayılan eylemi belirtmiş olmama rağmen, aslında istediğim eylemi sadece denetleyici ve parametreleri değil, html bağlantıma koymak zorunda kaldım.
Shaggy13spe

5
@DavidHyogo: Aynı sorunu yaşadım ve rota şablonu parametrelerinizin eylem yöntemi parametre adlarıyla tam olarak eşleşmesi gerektiğini keşfettim; örneğin, {controller} / {action} / {artistName} / {apikey} olarak tanımlanan rota için eylem yönteminin imzası olmalıdır public ActionResult MyMethod (string artistName, string apikey)
Mishra

6
Ayrıca özel URL'nize ulaşmadan önce URL'nizin varsayılan rotaya yakalanmadığından emin olun. İlk maçı, onları nasıl tanımladığınıza bağlı olarak kullanır. Benim durumumda, varsayılan dizin için "MyController / {year} / {month}" rotasını kullanmaya çalışıyordum, ancak {controller} / {action} / {id} yolu URL'imle eşleşiyordu (MyController / 2015 / 04), bu yüzden 404 alıyordum çünkü 2015 adında hiçbir işlem yoktu. Özel rotamı en üste taşımak sorunu çözdü.
Sam

Routeconfig içindeki parametre adı Action imzamla eşleşmedi, bu yüzden işe yaramadı, @dotnetguy tarafından açıklanan adımları izledim ve işe yaradı
pepitomb

26

MVC 5 ile başlayarak, URL parametresi yapılandırmasını denetleyicilerinize taşımak için Nitelik Yönlendirme'yi de kullanabilirsiniz.

Ayrıntılı bir tartışma için: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

Özet:

İlk olarak özellik yönlendirmeyi etkinleştirirsiniz

 public class RouteConfig 
 {
     public static void RegisterRoutes(RouteCollection routes)
     {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

         routes.MapMvcAttributeRoutes();
     } 
 }

Ardından parametreleri ve isteğe bağlı olarak veri türlerini tanımlamak için özellikleri kullanabilirsiniz

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)

5
ASP.NET Core MVC'deki
Bernard Vander

21

Sorgu dizesinden rastgele parametreler geçirebilirsiniz, ancak RESTful şekilde işlemek için özel yollar da ayarlayabilirsiniz:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&
                                  api_key=b25b959554ed76058ac220b7b2e0a026

Olabilirdi:

routes.MapRoute(
    "ArtistsImages",
    "{ws}/artists/{artist}/{action}/{*apikey}",
    new { ws = "2.0", controller="artists" artist = "", action="", apikey="" }
    );

Birisi aşağıdaki rotayı kullandıysa:

ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/

Onları örnek sorgu dizginizin yaptığı yere götürecektir.

Yukarıdaki örnek yalnızca bir örnektir ve insanların URL'yi 'hacklemediğinden' emin olmak için ayarlamanız gereken iş kurallarını ve kısıtlamalarını uygulamaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.