ASP.NET Core denetleyici eylemlerine yönlendirme
Ryan şimdi ak, Kirk Larkabağıve Rick Anderson
ASP.NET Core denetleyicileri, gelen isteklerin url 'leriyle eşleştirmek ve bunları eylemlerleeşlemek için yönlendirme ara yazılımını kullanır. Yol şablonları:
- Program. cs veya özniteliklerde başlangıç olarak tanımlanmıştır.
- URL yollarının eylemlerlenasıl eşleştiğini betimleyen.
- Bağlantıların URL 'Leri oluşturmak için kullanılır. Oluşturulan bağlantılar genellikle yanıtlar halinde döndürülür.
Eylemler genel olarak-yönlendirildi veya Attribute-yönlendirildi' dir. Bir yolun denetleyiciye veya eyleme yerleştirilmesi, BT özniteliğinin yönlendirilmesini sağlar. Daha fazla bilgi için bkz. karma yönlendirme .
Bu belge:
- MVC ve yönlendirme arasındaki etkileşimleri açıklar:
- Tipik MVC uygulamalarının yönlendirme özelliklerini kullanma şekli.
- Her ikisini de içerir:
- Geleneksel yönlendirme genellikle denetleyiciler ve görünümlerle kullanılır.
- REST API 'Leri ile kullanılan öznitelik yönlendirme . Birincil olarak REST API 'Leri için yönlendirme ile ilgileniyorsanız, REST API 'leri Için öznitelik yönlendirme bölümüne atlayın.
- Bkz. Gelişmiş yönlendirme ayrıntıları için yönlendirme .
- Endpoint Routing adlı varsayılan yönlendirme sistemine başvurur. Uyumluluk amaçlarıyla önceki yönlendirme sürümü ile denetleyicileri kullanmak mümkündür. Yönergeler için 2.2-3.0 geçiş kılavuzuna bakın.
Geleneksel rotayı ayarlama
ASP.NET Core MVC şablonu, aşağıdakilere benzer geleneksel yönlendirme kodu oluşturur:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
MapControllerRoute tek bir yol oluşturmak için kullanılır. Tek yol yol olarak adlandırılır default . Denetleyiciler ve görünümler içeren çoğu uygulama, yola benzer bir rota şablonu kullanır default . REST API 'Leri öznitelik yönlendirmeyikullanmalıdır.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Yol şablonu "{controller=Home}/{action=Index}/{id?}" :
Şöyle bir URL yoluyla eşleşir
/Products/Details/5{ controller = Products, action = Details, id = 5 }Yolu simgeleştirileyerek yol değerlerini ayıklar. Uygulamanın adlı bir denetleyici ve bir eylem varsa yol değerlerinin ayıklanması bir eşleşme ile sonuçlanırProductsControllerDetails:public class ProductsController : Controller { public IActionResult Details(int id) { return ControllerContext.MyDisplayRouteInfo(id); } }Mydisplayrouteınfo , Rick.Docs. Samples. routeınfo NuGet paketi tarafından sağlanır ve rota bilgilerini görüntüler.
/Products/Details/5model,id = 5parametresini olarak ayarlamak için değerini bağlarid5. Daha fazla ayrıntı için bkz. model bağlama .{controller=Home}``HomeVarsayılan olarak tanımlarcontroller.{action=Index}``IndexVarsayılan olarak tanımlaraction.?İçindeki karakter,{id?}idisteğe bağlı olarak tanımlar.Bir eşleşme için URL yolunda varsayılan ve isteğe bağlı yol parametrelerinin mevcut olması gerekmez. Yol şablonu sözdiziminin ayrıntılı açıklaması için bkz. route Template Reference .
URL yoluyla eşleşir
/.Yol değerlerini üretir
{ controller = Home, action = Index }.
İçin değerleri controller ve action varsayılan değerleri kullanır. id URL yolunda karşılık gelen bir kesim olmadığından değer üretmez. / yalnızca bir ve eylemi varsa eşleşir HomeController Index :
public class HomeController : Controller
{
public IActionResult Index() { ... }
}
Önceki denetleyici tanımı ve yönlendirme şablonunu kullanarak, HomeController.Index eylem AŞAĞıDAKI URL yolları için çalıştırılır:
/Home/Index/17/Home/Index/Home/
URL yolu, / yönlendirme şablonu varsayılan Home denetleyicilerini ve eylemini kullanır Index . URL yolu, /Home yönlendirme şablonu varsayılan eylemini kullanır Index .
Kolaylık yöntemi MapDefaultControllerRoute :
app.MapDefaultControllerRoute();
Yerine
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Önemli
Yönlendirme, UseRouting ve UseEndpoints ara yazılımı kullanılarak yapılandırılır. Denetleyicileri kullanmak için:
- MapControllers Öznitelik yönlendirmeli denetleyicileri eşleme çağrısı.
- MapControllerRoute MapAreaControllerRoute Hem genel olarak yönlendirmeli denetleyicileri hem de öznitelik yönlendirmeli denetleyicileri eşlemek için veya öğesini çağırın.
Geleneksel yönlendirme
Geleneksel yönlendirme, denetleyiciler ve görünümlerle kullanılır. defaultYol:
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Yukarıdaki, geleneksel bir yolun örneğidir. Bu, URL yolları için bir kural oluşturduğundan geleneksel yönlendirme olarak adlandırılır:
- İlk yol segmenti,
{controller=Home}, denetleyici adıyla eşlenir. - İkinci kesim,
{action=Index}, eylem adıyla eşlenir. - Üçüncü segment,
{id?}isteğe bağlı olarak kullanılırid.?İçinde,{id?}isteğe bağlı yapar.idbir model varlığına eşlemek için kullanılır.
Bu default yolu kullanarak, URL yolu:
/Products/List``ProductsController.Listeyleme eşlenir./Blog/Article/17ile eşlenirBlogController.Articleve model genellikleidparametresini 17 ' ye bağlar.
Bu eşleme:
- Yalnızca denetleyiciyi ve eylem adlarını temel alır.
- Ad alanlarını, kaynak dosya konumlarını veya yöntem parametrelerini temel alan değildir.
Varsayılan yol ile geleneksel yönlendirmeyi kullanmak, her eylem için yeni bir URL düzeniyle karşılaşmadan uygulamanın oluşturulmasına olanak sağlar. CRUD stilinde eylemlere sahip bir uygulama için, denetleyiciler arasında URL 'ler için tutarlılık vardır:
- Kodu basitleştirmeye yardımcı olur.
- Kullanıcı arabirimini daha öngörülebilir hale getirir.
Uyarı
idÖnceki kodda, yol şablonu tarafından isteğe bağlı olarak tanımlanmıştır. Eylemler, URL 'nin bir parçası olarak belirtilen isteğe bağlı KIMLIK olmadan çalıştırılabilir. Genellikle, id URL 'den atlandığında:
id,0model bağlama tarafından olarak ayarlanır.- Veritabanında eşleşen bir varlık bulunamadı
id == 0.
Öznitelik yönlendirme , kimliği bazı eylemler için gerekli hale getirmek için ayrıntılı denetim sağlar ve diğerleri için değildir. Kurala göre belgeler, id doğru kullanımlarda görünebilecekleri gibi isteğe bağlı parametreler içerir.
Çoğu uygulama, URL 'Lerin okunabilir ve anlamlı olması için temel ve açıklayıcı bir yönlendirme şeması seçmelidir. Varsayılan geleneksel yol {controller=Home}/{action=Index}/{id?} :
- Temel ve açıklayıcı bir yönlendirme düzenini destekler.
- , UI tabanlı uygulamalar için kullanışlı bir başlangıç noktasıdır.
- Birçok Web UI uygulaması için tek yol şablonu gereklidir. Daha büyük Web UI uygulamaları için, alan kullanan başka bir yol da sıkça gereklidir.
MapControllerRoute ve MapAreaRoute :
- , Çağrıldığı sıraya göre kendi uç noktalarına otomatik olarak bir sipariş değeri atayın.
ASP.NET Core uç nokta yönlendirme:
- Bir yol kavramı yoktur.
- , Genişletilebilirlik yürütülmesi için sıralama garantisi sağlamaz, tüm uç noktalar bir kerede işlenir.
İstekleri eşleme gibi yerleşik yönlendirme uygulamalarının nasıl yapıldığını görmek için günlük kaydını etkinleştirin Route .
Öznitelik yönlendirme bu belgenin ilerleyen kısımlarında açıklanmıştır.
Birden çok geleneksel yollar
UseEndpoints Ve ' ye daha fazla çağrı eklenerek, içine birden çok geleneksel yol eklenebilir MapControllerRoute MapAreaControllerRoute . Bunun yapılması, birden çok kural tanımlamayı veya belirli bir eylemeadanmış geleneksel yollar eklemeyi sağlar; örneğin:
app.MapControllerRoute(name: "blog",
pattern: "blog/{*article}",
defaults: new { controller = "Blog", action = "Article" });
app.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
blogÖnceki koddaki yol, ayrılmış bir geleneksel yoldur. Ayrılmış bir geleneksel yol olarak adlandırılır çünkü:
- Geleneksel yönlendirmekullanır.
- Belirli bir eylemeayrılmıştır.
controllerVe action yol şablonunda parametre olarak görünmediği için "blog/{*article}" :
- Yalnızca varsayılan değerleri olabilir
{ controller = "Blog", action = "Article" }. - Bu yol her zaman eyleme eşlenir
BlogController.Article.
/Blog, /Blog/Article ve, /Blog/{any-string} Blog rotası ile eşleşen tek URL yollarıdır.
Önceki örnek:
blogyol, önce eklendiğinden, rotadan eşleşme için daha yüksek önceliğe sahiptirdefault.- , URL 'nin bir parçası olarak bir makale adının olması gereken tipik bir başlık stili yönlendirme örneğidir.
Uyarı
ASP.NET Core, yönlendirme:
- Yol adlı bir kavram tanımlayın.
UseRoutingara yazılım ardışık düzenine eşleşen rota ekler.UseRoutingAra yazılım, uygulamada tanımlanan uç noktalar kümesine bakar ve isteğe bağlı olarak en iyi uç nokta eşleşmesini seçer. - Veya gibi genişletilebilirlik yürütme sırası hakkında garanti sağlar IRouteConstraint IActionConstraint .
Bkz. yönlendirme ile ilgili başvuru malzemeleri için yönlendirme .
Geleneksel yönlendirme sırası
Geleneksel yönlendirme yalnızca uygulama tarafından tanımlanan eylem ve denetleyicinin bir bileşimiyle eşleşir. Bu, geleneksel yolların çakıştığı durumları basitleştirmek için tasarlanmıştır.
,, Ve kullanarak yollar ekleme, MapControllerRoute MapDefaultControllerRoute MapAreaControllerRoute çağırdıkları sıraya göre bitiş noktalarına otomatik olarak bir sipariş değeri atar. Daha önce görüntülenen bir rotadaki eşleşmelerin önceliği daha yüksektir. Geleneksel yönlendirme sıra bağımlıdır. Genel olarak, alanlar içeren rotalar daha önce bir alan olmadan rotalardan daha belirgin olduklarından yerleştirilmelidir. Catch-all yol parametrelerine sahip adanmış geleneksel yollar {*article} , bir yol çok uzun sürebilir , yani diğer yollarla eşleştirmek istediğiniz URL 'lerle eşleşir. Doyumsuz yollarını daha sonra yol tablosuna yerleştirerek doyumsuz eşleşmelerini önleyin.
Uyarı
Bir catch-all parametresi, yönlendirdeki bir hata nedeniyle yollarla yanlış bir şekilde eşleşmeyebilir. Bu hatadan etkilenen uygulamalar aşağıdaki özelliklere sahiptir:
- Örneğin, bir catch-all rotası
{**slug}" - Catch-all yolu eşleşmesi gereken isteklerle eşleşemez.
- Diğer yolların kaldırılması, catch-all yolunun çalışmaya başlamasını sağlar.
Bu hataya vurmakta olan örnekler için GitHub hataları 18677 ve 16579 bakın.
Bu hata için bir katılım çözümü .NET Core 3.1.301 SDK ve sonraki sürümlerdebulunur. Aşağıdaki kod, bu hatayı düzelten bir iç anahtar ayarlar:
public static void Main(string[] args)
{
AppContext.SetSwitch("Microsoft.AspNetCore.Routing.UseCorrectCatchAllBehavior",
true);
CreateHostBuilder(args).Build().Run();
}
// Remaining code removed for brevity.
Belirsiz eylemleri çözme
Yönlendirme ile iki uç nokta eşleşmesi durumunda, yönlendirme aşağıdakilerden birini yapmanız gerekir:
- En iyi aday ' ı seçin.
- Bir özel durum oluşturur.
Örnek:
public class Products33Controller : Controller
{
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpPost]
public IActionResult Edit(int id, Product product)
{
return ControllerContext.MyDisplayRouteInfo(id, product.name);
}
}
Yukarıdaki denetleyici, eşleşen iki eylemi tanımlar:
- URL yolu
/Products33/Edit/17 - Veri yönlendirin
{ controller = Products33, action = Edit, id = 17 }.
Bu, MVC denetleyicileri için tipik bir modeldir:
Edit(int)bir ürünü düzenlemek için bir form görüntüler.Edit(int, Product)Postalanan formu işler.
Doğru yolu çözümlemek için:
Edit(int, Product)istek bir HTTP olduğunda seçilirPOST.Edit(int)http fiili başka bir şey olduğunda seçilir.Edit(int)genellikle aracılığıyla çağrılırGET.
, HttpPostAttribute , [HttpPost] İsteğin HTTP yöntemine göre seçim yapabilmesi için yönlendirme için verilmiştir. , HttpPostAttribute Edit(int, Product) Daha iyi bir eşleşme yapar Edit(int) .
Gibi özniteliklerin rolünü anlamanız önemlidir HttpPostAttribute . Benzer öznitelikler diğer http fiilleriiçin tanımlanmıştır. Geleneksel yönlendirmesinde, bir görüntüleme formu, gönder formu iş akışının bir parçası olduklarında aynı eylem adını kullanmak yaygın olarak kullanılan bir işlemdir. Örneğin, bkz. Iki düzenleme eylemi yöntemini İnceleme.
Yönlendirme bir en iyi aday seçebilirse, AmbiguousMatchException birden fazla eşleşen uç noktayı listeleyerek bir oluşturulur.
Geleneksel yol adları
Dizeler "blog" ve "default" Aşağıdaki örneklerde geleneksel yol adları verilmiştir:
app.MapControllerRoute(name: "blog",
pattern: "blog/{*article}",
defaults: new { controller = "Blog", action = "Article" });
app.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Yol adları, yola mantıksal bir ad verir. Adlandırılmış yol, URL oluşturmak için kullanılabilir. Adlandırılmış bir yol kullanmak, yolların sıralaması URL oluşturma karmaşık hale geldiğinde URL oluşturmayı basitleştirir. Yol adları benzersiz uygulama genelinde olmalıdır.
Yol adları:
- İsteklerin URL 'siyle eşleşmesi veya işlenmesi üzerinde hiçbir etkisi yoktur.
- Yalnızca URL oluşturmak için kullanılır.
Yol adı kavramı ıendpointnamemetadataolarak yönlendirme ile temsil edilir. Terimler yol adı ve uç nokta adı:
- Değiştirilebilir.
- Belgede kullanılan ve kod, açıklanan API 'ye bağlıdır.
REST API 'Leri için öznitelik yönlendirme
REST API 'Leri, uygulamanın işlevselliğini http fiilleritarafından temsil edilen bir kaynak kümesi olarak modellemek için öznitelik yönlendirmeyi kullanmalıdır.
Öznitelik yönlendirme eylemleri doğrudan yönlendirme şablonlarına eşlemek için bir öznitelik kümesi kullanır. Aşağıdaki kod, bir REST API için tipik bir sonraki örnekte kullanılır:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Önceki kodda, MapControllers UseEndpoints öznitelik yönlendirmeli denetleyicileri eşlemek için içinde çağırılır.
Aşağıdaki örnekte:
HomeControllerVarsayılan geleneksel yolun eşleşdiküyle benzer bir URL kümesiyle eşleşir{controller=Home}/{action=Index}/{id?}.
public class HomeController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
[Route("Home/Index/{id?}")]
public IActionResult Index(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[Route("Home/About")]
[Route("Home/About/{id?}")]
public IActionResult About(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Eylem,, HomeController.Index veya URL yollarından herhangi biri için çalıştırılır / /Home /Home/Index /Home/Index/3 .
Bu örnek, öznitelik yönlendirme ve geleneksel yönlendirmearasında bir temel programlama farkı vurgulamaktadır. Öznitelik yönlendirme için bir yol belirtmek için daha fazla giriş gerekir. Geleneksel varsayılan yol, yönlendirmeleri daha succinctly işler. Ancak, öznitelik yönlendirme izin verir ve her eylemehangi rota şablonlarının uygulanacağını kesin olarak denetler.
Öznitelik yönlendirme ile, denetleyici ve eylem adları, belirteç değiştirme kullanılmadığı takdirde, eylemin eşleştirildiği hiçbir parçasını oynar. Aşağıdaki örnek, önceki örnekle aynı URL 'Lerle eşleşir:
public class MyDemoController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
[Route("Home/Index/{id?}")]
public IActionResult MyIndex(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[Route("Home/About")]
[Route("Home/About/{id?}")]
public IActionResult MyAbout(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Aşağıdaki kod, ve için belirteç yerini action kullanır controller :
public class HomeController : Controller
{
[Route("")]
[Route("Home")]
[Route("[controller]/[action]")]
public IActionResult Index()
{
return ControllerContext.MyDisplayRouteInfo();
}
[Route("[controller]/[action]")]
public IActionResult About()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Aşağıdaki kod [Route("[controller]/[action]")] Denetleyici için geçerlidir:
[Route("[controller]/[action]")]
public class HomeController : Controller
{
[Route("~/")]
[Route("/Home")]
[Route("~/Home/Index")]
public IActionResult Index()
{
return ControllerContext.MyDisplayRouteInfo();
}
public IActionResult About()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Yukarıdaki kodda, Index Yöntem şablonlarının sonuna / veya yol şablonlarına eklenmiş olması gerekir ~/ . Bir eyleme uygulanan / veya bu ~/ denetleyiciye uygulanan rota şablonlarıyla birlikte bir araya getirilen bir eyleme uygulanan rota şablonları.
Rota şablonu seçimi hakkında bilgi için bkz. route Template önceliği .
Ayrılmış yönlendirme adları
Aşağıdaki anahtar sözcükler, denetleyiciler veya sayfalar kullanılırken ayrılmış yol parametresi adlarıdır Razor :
actionareacontrollerhandlerpage
pageÖznitelik yönlendirme ile yol parametresi olarak kullanmak yaygın bir hatadır. Bunun yapılması, URL oluşturma ile tutarsız ve kafa karıştırıcı davranışa neden olur.
public class MyDemo2Controller : Controller
{
[Route("/articles/{page}")]
public IActionResult ListArticles(int page)
{
return ControllerContext.MyDisplayRouteInfo(page);
}
}
Özel parametre adları URL oluşturma tarafından bir URL oluşturma işleminin bir sayfaya mı yoksa bir denetleyiciye mi başvurduğunu belirlemekte kullanılır Razor .
- Aşağıdaki anahtar sözcükler bir Razor görünüm veya sayfa bağlamında ayrılmıştır Razor :
pageusingnamespaceinjectsectioninheritsmodeladdTagHelperremoveTagHelper
Bu anahtar sözcükler bağlantı oluşturmaları, model bağlama parametreleri veya en üst düzey özellikler için kullanılmamalıdır.
HTTP fiili şablonları
ASP.NET Core aşağıdaki HTTP fiili şablonlarına sahiptir:
Rota şablonları
ASP.NET Core aşağıdaki yol şablonlarına sahiptir:
- Tüm http fiili şablonları rota şablonlarıdır.
- Yolu
Http fiili öznitelikleriyle öznitelik yönlendirme
Aşağıdaki denetleyiciyi göz önünde bulundurun:
[Route("api/[controller]")]
[ApiController]
public class Test2Controller : ControllerBase
{
[HttpGet] // GET /api/test2
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")] // GET /api/test2/xyz
public IActionResult GetProduct(string id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int/{id:int}")] // GET /api/test2/int/3
public IActionResult GetIntProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int2/{id}")] // GET /api/test2/int2/3
public IActionResult GetInt2Product(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yukarıdaki kodda:
- Her eylem
[HttpGet]yalnızca http get istekleriyle eşleştirmeyi kısıtlayan özniteliği içerir. GetProductEylem, şablonu içerir"{id}", bu nedenleid"api/[controller]"denetleyicideki şablonun sonuna eklenir. Yöntemler şablonu"api/[controller]/"{id}"". Bu nedenle bu eylem yalnızca/api/test2/xyz,,/api/test2/123vb. için get istekleri ile eşleşir/api/test2/{any string}.[HttpGet("{id}")] // GET /api/test2/xyz public IActionResult GetProduct(string id) { return ControllerContext.MyDisplayRouteInfo(id); }GetIntProductEylem"int/{id:int}")şablonu içerir.:intŞablonun kısmı,idyol değerlerini bir tamsayıya dönüştürülebileceği dizelere kısıtlar. Bir GET isteği/api/test2/int/abc:- Bu eylemle eşleşmiyor.
- Bir 404 bulunamadı hatası döndürür.
[HttpGet("int/{id:int}")] // GET /api/test2/int/3 public IActionResult GetIntProduct(int id) { return ControllerContext.MyDisplayRouteInfo(id); }
GetInt2ProductEylem şablonda bulunur{id}, ancakidbir tamsayıya dönüştürülemeyen değerlerle sınırlandırmaz. Bir GET isteği/api/test2/int2/abc:- Bu rota ile eşleşir.
- Model bağlama
abcbir tamsayıya dönüştürülemez.idYönteminin parametresi tamsayıdır. - Model bağlama bir tamsayıya dönüştürülemediğinden, 400 hatalı bir istek döndürür
abc.[HttpGet("int2/{id}")] // GET /api/test2/int2/3 public IActionResult GetInt2Product(int id) { return ControllerContext.MyDisplayRouteInfo(id); }
Öznitelik yönlendirme,, HttpMethodAttribute ve gibi öznitelikleri HttpPostAttribute kullanabilir HttpPutAttribute HttpDeleteAttribute . Tüm http fiili öznitelikleri bir yol şablonunu kabul eder. Aşağıdaki örnekte, aynı yol şablonuyla eşleşen iki eylem gösterilmektedir:
[ApiController]
public class MyProductsController : ControllerBase
{
[HttpGet("/products3")]
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpPost("/products3")]
public IActionResult CreateProduct(MyProduct myProduct)
{
return ControllerContext.MyDisplayRouteInfo(myProduct.Name);
}
}
URL yolu kullanılarak /products3 :
MyProductsController.ListProductsEylem http fiili olduğunda çalışırGET.MyProductsController.CreateProductEylem http fiili olduğunda çalışırPOST.
Bir REST API oluştururken, [Route(...)] eylem tüm http yöntemlerini kabul ettiğinden bir eylem yönteminde kullanmanız gerekecektir. API 'nizin neleri desteklediği hakkında kesin olması için, daha özel http fiili özniteliği kullanmak daha iyidir. REST API 'lerinin istemcileri, hangi yolların ve HTTP fiillerinin belirli mantıksal işlemlere eşlendiğini bilmelidir.
REST API 'Leri, uygulamanın işlevselliğini HTTP fiilleri tarafından temsil edilen bir kaynak kümesi olarak modellemek için öznitelik yönlendirmeyi kullanmalıdır. Bu, örneğin, aynı mantıksal kaynaktaki al ve postala gibi birçok işlemin aynı URL 'YI kullanması anlamına gelir. Öznitelik yönlendirme, bir API 'nin Genel uç nokta yerleşimini dikkatle tasarlamak için gereken bir denetim düzeyi sağlar.
Bir öznitelik yolu belirli bir eyleme uyguladığı için, yol şablonu tanımının bir parçası olarak gerekli parametreleri yapmak kolaydır. Aşağıdaki örnekte, id URL yolunun bir parçası olarak gereklidir:
[ApiController]
public class Products2ApiController : ControllerBase
{
[HttpGet("/products2/{id}", Name = "Products_List")]
public IActionResult GetProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Products2ApiController.GetProduct(int)Eylem:
- , Şunun gibi URL yoluyla çalıştırılır
/products2/3 - URL yoluyla çalıştırılmadı
/products2.
[Tüketir] özniteliği, desteklenen istek içerik türlerini sınırlama eylemi sağlar. Daha fazla bilgi için bkz. desteklenen istek içerik türlerini tüketir özniteliğiyle tanımlama.
Yol şablonlarının ve ilgili seçeneklerin tam açıklaması için bkz. yönlendirme .
Hakkında daha fazla bilgi için [ApiController] bkz. Apicontroller özniteliği.
Yönlendirme adı
Aşağıdaki kod, bir yol adı tanımlar Products_List :
[ApiController]
public class Products2ApiController : ControllerBase
{
[HttpGet("/products2/{id}", Name = "Products_List")]
public IActionResult GetProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yol adları, belirli bir yolu temel alan bir URL oluşturmak için kullanılabilir. Yol adları:
- Yönlendirmenin URL eşleşen davranışı üzerinde hiçbir etkisi yoktur.
- Yalnızca URL oluşturma için kullanılır.
Yol adları, uygulama genelinde benzersiz olmalıdır.
Önceki kodu, id parametreyi isteğe bağlı () olarak tanımlayan geleneksel varsayılan rotayla kontrast {id?} . API 'Leri tam olarak belirtme özelliği, farklı eylemlere izin verilmesi ve dağıtılması gibi avantajlara sahiptir /products /products/5 .
Öznitelik yollarını birleştirme
Öznitelik yönlendirmeyi daha az tekrarlı hale getirmek için, denetleyicideki yol öznitelikleri, bireysel eylemlerdeki rota öznitelikleriyle birleştirilir. Denetleyicide tanımlanan tüm yol şablonları, eylemlerdeki rota şablonlarına eklenir. Bir Route özniteliğinin denetleyiciye yerleştirilmesi, denetleyicideki Tüm eylemlerin öznitelik yönlendirme kullanmasını sağlar.
[ApiController]
[Route("products")]
public class ProductsApiController : ControllerBase
{
[HttpGet]
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")]
public IActionResult GetProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yukarıdaki örnekte:
- URL yolu
/productseşleşiyorProductsApi.ListProducts - URL yolu
/products/5eşleşiyorProductsApi.GetProduct(int).
Bu eylemlerin her ikisi de, özniteliğiyle işaretlendiğinden yalnızca HTTP ile eşleşir GET [HttpGet] .
Bir eyleme uygulanan / veya bu ~/ denetleyiciye uygulanan rota şablonlarıyla birlikte bir araya getirilen bir eyleme uygulanan rota şablonları. Aşağıdaki örnek, varsayılan rotaya benzer bir URL yolları kümesiyle eşleşir.
[Route("Home")]
public class HomeController : Controller
{
[Route("")]
[Route("Index")]
[Route("/")]
public IActionResult Index()
{
return ControllerContext.MyDisplayRouteInfo();
}
[Route("About")]
public IActionResult About()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Aşağıdaki tabloda [Route] önceki koddaki öznitelikler açıklanmaktadır:
| Öznitelik | İle birleştirir [Route("Home")] |
Rota şablonunu tanımlar |
|---|---|---|
[Route("")] |
Yes | "Home" |
[Route("Index")] |
Yes | "Home/Index" |
[Route("/")] |
Hayır | "" |
[Route("About")] |
Yes | "Home/About" |
Öznitelik yolu sırası
Yönlendirme bir ağaç oluşturur ve aynı anda tüm uç noktaları eşleştirir:
- Yol girdileri ideal bir sıralamaya yerleştirilmiş gibi davranır.
- En özel yolların, daha genel yollardan önce yürütülmesi şansınız vardır.
Örneğin, gibi bir öznitelik yolu, blog/search/{topic} gibi bir öznitelik rotasına göre daha özgüdür blog/{*article} . blog/search/{topic}Daha belirgin olduğundan, yolun önceliği daha yüksektir. Geleneksel yönlendirmeyikullanarak, yolları istenen sırada yerleştirmekten geliştirici sorumludur.
Öznitelik yolları özelliği kullanarak bir sıra yapılandırabilir Order . Tüm Framework 'ün yol öznitelikleri dahil edilmiştir Order . Yollar, özelliğin artan sıralamasına göre işlenir Order . Varsayılan sıra 0 . Bir Order = -1 siparişi ayarlamadığı rotalardan önce çalıştırmaları kullanarak bir rota ayarlama. Order = 1Varsayılan yol sıralaması sonrasında çalıştırmaları kullanarak bir rota ayarlama.
Uygulamasına bağlı kaçının Order . Bir uygulamanın URL 'SI alanı, doğru şekilde yönlendirmek için açık sıra değerleri gerektiriyorsa, bu durumda istemciler de kafa karıştırıcı olabilir. Genel olarak, öznitelik yönlendirme URL ile eşleşen doğru yolu seçer. URL oluşturma için kullanılan varsayılan sıra çalışmıyorsa, geçersiz kılma olarak bir yol adı kullanılması, özelliği uygulamadan daha basittir Order .
Her ikisi de eşleşen yolu tanımlayan aşağıdaki iki denetleyicisi göz önünde bulundurun /home :
public class HomeController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
[Route("Home/Index/{id?}")]
public IActionResult Index(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[Route("Home/About")]
[Route("Home/About/{id?}")]
public IActionResult About(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
public class MyDemoController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
[Route("Home/Index/{id?}")]
public IActionResult MyIndex(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[Route("Home/About")]
[Route("Home/About/{id?}")]
public IActionResult MyAbout(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
/homeYukarıdaki kodla istemek şuna benzer bir özel durum oluşturur:
AmbiguousMatchException: The request matched multiple endpoints. Matches:
WebMvcRouting.Controllers.HomeController.Index
WebMvcRouting.Controllers.MyDemoController.MyIndex
OrderYol özniteliklerinden birine ekleme belirsizliği çözer:
[Route("")]
[Route("Home", Order = 2)]
[Route("Home/MyIndex")]
public IActionResult MyIndex()
{
return ControllerContext.MyDisplayRouteInfo();
}
Yukarıdaki kodla /home HomeController.Index bitiş noktasını çalıştırır. Öğesine ulaşmak için MyDemoController.MyIndex /home/MyIndex . Not:
- Yukarıdaki kod bir örnek veya kötü yönlendirme tasarımdır. Özelliği göstermek için kullanılmıştı
Order. OrderÖzelliği yalnızca belirsizlik çözümleniyor, bu şablon eşleştirilemez. Şablonu kaldırmak daha iyi olacaktır[Route("Home")].
Bkz. Razor sayfa yönlendirme ve uygulama kuralları: sayfalarla rota sıralaması hakkında bilgi için rota sırası Razor .
Bazı durumlarda, belirsiz yollarla bir HTTP 500 hatası döndürülür. Hangi uç noktaların neden olduğunu görmek için günlük kaydını kullanın AmbiguousMatchException .
Yönlendirme şablonlarında belirteç değiştirme [denetleyici], [eylem], [alan]
Daha kolay olması için, öznitelik rotaları bir belirteci köşeli ayraç (,) içine alarak belirteç değiştirmeyi destekler [ ] . , Ve belirteçleri, [action] [area] [controller] yolun tanımlandığı eylemden eylem adı, alan adı ve denetleyici adı değerleriyle değiştirilmiştir:
[Route("[controller]/[action]")]
public class Products0Controller : Controller
{
[HttpGet]
public IActionResult List()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")]
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yukarıdaki kodda:
[HttpGet]
public IActionResult List()
{
return ControllerContext.MyDisplayRouteInfo();
}
- Eşleştir
/Products0/List
[HttpGet("{id}")]
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
- Eşleştir
/Products0/Edit/{id}
Belirteç değişikliği, öznitelik yollarının oluşturulması için son adım olarak gerçekleşir. Yukarıdaki örnek aşağıdaki kodla aynı şekilde davranır:
public class Products20Controller : Controller
{
[HttpGet("[controller]/[action]")] // Matches '/Products20/List'
public IActionResult List()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("[controller]/[action]/{id}")] // Matches '/Products20/Edit/{id}'
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Bunu Ingilizce dışındaki bir dilde okuyorsanız, kod açıklamalarını yerel dilinizde görmek istiyorsanız bu GitHub tartışma sorununu bize gönderin.
Öznitelik yolları devralma ile de birleştirilmiş olabilir. Bu, belirteç değiştirme ile birlikte güçlü bir araçtır. Belirteç değiştirme, öznitelik yolları tarafından tanımlanan yol adları için de geçerlidir.
[Route("[controller]/[action]", Name="[controller]_[action]")]her eylem için benzersiz bir yol adı üretir:
[ApiController]
[Route("api/[controller]/[action]", Name = "[controller]_[action]")]
public abstract class MyBase2Controller : ControllerBase
{
}
public class Products11Controller : MyBase2Controller
{
[HttpGet] // /api/products11/list
public IActionResult List()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")] // /api/products11/edit/3
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Sabit belirteç değiştirme sınırlayıcı veya ile eşleşmesi için karakterini ( veya ) tekrarlayarak kaçış [ ] [[ karakteriyle kaçış karakterine kaçış karakteri. ]]
Belirteç değişimini özelleştirmek için parametre dönüştürücü kullanma
Belirteç değiştirme, parametre dönüştürücü kullanılarak özelleştirilebilir. Parametre dönüştürücü, IOutboundParameterTransformer parametrelerin değerini uygulayan ve dönüştüren bir parametredir. Örneğin, özel parametre dönüştürücü SlugifyParameterTransformer yol değerini SubscriptionManagement olarak subscription-management değiştirir:
using System.Text.RegularExpressions;
public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
public string? TransformOutbound(object? value)
{
if (value == null) { return null; }
return Regex.Replace(value.ToString()!,
"([a-z])([A-Z])",
"$1-$2",
RegexOptions.CultureInvariant,
TimeSpan.FromMilliseconds(100)).ToLowerInvariant();
}
}
, RouteTokenTransformerConvention aşağıdakilere neden olan bir uygulama modeli kuralıdır:
- Bir uygulamanın tüm öznitelik yollarında parametre dönüştürücü uygular.
- Öznitelik yol belirteci değerlerini değiştirildikleri şekilde özeller.
public class SubscriptionManagementController : Controller
{
[HttpGet("[controller]/[action]")]
public IActionResult ListAll()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Yukarıdaki yöntem ListAll ile /subscription-management/list-all eştir.
RouteTokenTransformerConventionseçeneği olarak kaydedilir:
using Microsoft.AspNetCore.Mvc.ApplicationModels;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews(options =>
{
options.Conventions.Add(new RouteTokenTransformerConvention(
new SlugifyParameterTransformer()));
});
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Slug tanımı için bkz. Slug üzerinde MDN web belgeleri.
Uyarı
System.Text.RegularExpressionsGüvenilmeyen girişi işlemek için kullanırken bir zaman aşımı geçirin. Kötü niyetli bir Kullanıcı, RegularExpressions hizmet reddi saldırısınaneden olacak giriş sağlayabilir. Zaman aşımını geçen ASP.NET Core Framework API 'Leri RegularExpressions .
Birden çok öznitelik yolu
Öznitelik yönlendirme, aynı eyleme ulaşan birden çok yol tanımlamayı destekler. Bunun en yaygın kullanımı, aşağıdaki örnekte gösterildiği gibi varsayılan geleneksel rotanın davranışını taklit etmektir:
[Route("[controller]")]
public class Products13Controller : Controller
{
[Route("")] // Matches 'Products13'
[Route("Index")] // Matches 'Products13/Index'
public IActionResult Index()
{
return ControllerContext.MyDisplayRouteInfo();
}
Denetleyiciye birden çok yol özniteliği koymak, her birinin eylem yöntemlerinde yol özniteliklerinin her biri ile birleştir olduğu anlamına gelir:
[Route("Store")]
[Route("[controller]")]
public class Products6Controller : Controller
{
[HttpPost("Buy")] // Matches 'Products6/Buy' and 'Store/Buy'
[HttpPost("Checkout")] // Matches 'Products6/Checkout' and 'Store/Checkout'
public IActionResult Buy()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Tüm HTTP fiil yolu kısıtlamaları IActionConstraint uygulanır.
Uygulayan birden çok yol özniteliği IActionConstraint bir eyleme yerleştirilsin mi:
- Her eylem kısıtlaması, denetleyiciye uygulanan yol şablonuyla bir araya geldi.
[Route("api/[controller]")]
public class Products7Controller : ControllerBase
{
[HttpPut("Buy")] // Matches PUT 'api/Products7/Buy'
[HttpPost("Checkout")] // Matches POST 'api/Products7/Checkout'
public IActionResult Buy()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Eylemlerde birden çok yol kullanmak yararlı ve güçlü görünebilir; uygulamanın URL alanı temel ve iyi tanımlanmış şekilde tutmak daha iyidir. Eylemlerde yalnızca gerektiğinde( örneğin, mevcut istemcileri desteklemek için) birden çok yol kullanın.
Öznitelik yolu isteğe bağlı parametrelerini, varsayılan değerleri ve kısıtlamaları belirtme
Öznitelik yolları, isteğe bağlı parametreler, varsayılan değerler ve kısıtlamalar belirtmek için geleneksel yollarla aynı satır içi söz dizimlerini destekler.
public class Products14Controller : Controller
{
[HttpPost("product14/{id:int}")]
public IActionResult ShowProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yukarıdaki kodda bir [HttpPost("product14/{id:int}")] yol kısıtlaması uygular. Eylem Products14Controller.ShowProduct yalnızca gibi URL yollarla eşdü. /product14/3 Yol şablonu {id:int} bölümü, bu segmenti yalnızca tamsayılarla kısıtlar.
Yol şablonu söz dizimlerinin ayrıntılı açıklaması için bkz. Yol Şablonu Başvurusu.
IRouteTemplateProvider kullanan özel yol öznitelikleri
Tüm yol öznitelikleri IRouteTemplateProvider uygulanır. Çalışma ASP.NET Core çalışma zamanı:
- Uygulama başlatıldığında denetleyici sınıflarında ve eylem yöntemlerinde öznitelikleri okur.
- İlk yol kümesi oluşturmak
IRouteTemplateProvideriçin uygulayan öznitelikleri kullanır.
Özel IRouteTemplateProvider yol özniteliklerini tanımlamak için uygulama. Her IRouteTemplateProvider biri özel bir yol şablonu, sırası ve adı ile tek bir yol tanımlamanızı sağlar:
public class MyApiControllerAttribute : Attribute, IRouteTemplateProvider
{
public string Template => "api/[controller]";
public int? Order => 2;
public string Name { get; set; } = string.Empty;
}
[MyApiController]
[ApiController]
public class MyTestApiController : ControllerBase
{
// GET /api/MyTestApi
[HttpGet]
public IActionResult Get()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Yukarıdaki yöntem Get Order = 2, Template = api/MyTestApi döndürür.
Öznitelik yollarını özelleştirmek için uygulama modelini kullanma
Uygulama modeli:
- Program.cs'de başlangıçta oluşturulan bir nesne modelidir.
- Bir uygulamada eylemleri yönlendirmek ve yürütmek ASP.NET Core tarafından kullanılan tüm meta verileri içerir.
Uygulama modeli, yol özniteliklerinden toplanan tüm verileri içerir. Yol özniteliklerinden veriler uygulama tarafından IRouteTemplateProvider sağlanır. Kural -ları:
- Yönlendirmenin nasıl davranacağını özelleştirmek için uygulama modelini değiştirmek üzere yazabilirsiniz.
- Uygulama başlangıcında okunur.
Bu bölümde, uygulama modeli kullanarak yönlendirmeyi özelleştirmenin temel bir örneği yer almaktadır. Aşağıdaki kod, yolları projenin klasör yapısıyla kabaca doğrular.
public class NamespaceRoutingConvention : Attribute, IControllerModelConvention
{
private readonly string _baseNamespace;
public NamespaceRoutingConvention(string baseNamespace)
{
_baseNamespace = baseNamespace;
}
public void Apply(ControllerModel controller)
{
var hasRouteAttributes = controller.Selectors.Any(selector =>
selector.AttributeRouteModel != null);
if (hasRouteAttributes)
{
return;
}
var namespc = controller.ControllerType.Namespace;
if (namespc == null)
return;
var template = new StringBuilder();
template.Append(namespc, _baseNamespace.Length + 1,
namespc.Length - _baseNamespace.Length - 1);
template.Replace('.', '/');
template.Append("/[controller]/[action]/{id?}");
foreach (var selector in controller.Selectors)
{
selector.AttributeRouteModel = new AttributeRouteModel()
{
Template = template.ToString()
};
}
}
}
Aşağıdaki kod, namespace kuralın yönlendirilen öznitelik denetleyicilerine uygulanmasına engel olur:
public void Apply(ControllerModel controller)
{
var hasRouteAttributes = controller.Selectors.Any(selector =>
selector.AttributeRouteModel != null);
if (hasRouteAttributes)
{
return;
}
Örneğin, aşağıdaki denetleyicide NamespaceRoutingConvention kullanmaz:
[Route("[controller]/[action]/{id?}")]
public class ManagersController : Controller
{
// /managers/index
public IActionResult Index()
{
var template = ControllerContext.ActionDescriptor.AttributeRouteInfo?.Template;
return Content($"Index- template:{template}");
}
public IActionResult List(int? id)
{
var path = Request.Path.Value;
return Content($"List- Path:{path}");
}
}
NamespaceRoutingConvention.Applyyöntemi:
- Denetleyici, öznitelik yönlendirildi ise hiçbir şey yapmadı.
- denetleyiciler şablonunu temel alarak ayarlar
namespaceve tabanınamespacekaldırılır.
, NamespaceRoutingConvention Program.cs içinde uygulanabilir:
using My.Application.Controllers;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews(options =>
{
options.Conventions.Add(
new NamespaceRoutingConvention(typeof(HomeController).Namespace!));
});
var app = builder.Build();
Örneğin, aşağıdaki denetleyiciyi düşünün:
using Microsoft.AspNetCore.Mvc;
namespace My.Application.Admin.Controllers
{
public class UsersController : Controller
{
// GET /admin/controllers/users/index
public IActionResult Index()
{
var fullname = typeof(UsersController).FullName;
var template =
ControllerContext.ActionDescriptor.AttributeRouteInfo?.Template;
var path = Request.Path.Value;
return Content($"Path: {path} fullname: {fullname} template:{template}");
}
public IActionResult List(int? id)
{
var path = Request.Path.Value;
return Content($"Path: {path} ID:{id}");
}
}
}
Yukarıdaki kodda:
- Temel:
namespaceMy.Application. - Yukarıdaki denetleyicinin tam adı
My.Application.Admin.Controllers.UsersControllerolur. - ,
NamespaceRoutingConventiondenetleyiciler şablonunu olarakAdmin/Controllers/Users/[action]/{id?ayarlar.
, NamespaceRoutingConvention denetleyiciye bir öznitelik olarak da uygulanabilir:
[NamespaceRoutingConvention("My.Application")]
public class TestController : Controller
{
// /admin/controllers/test/index
public IActionResult Index()
{
var template = ControllerContext.ActionDescriptor.AttributeRouteInfo?.Template;
var actionname = ControllerContext.ActionDescriptor.ActionName;
return Content($"Action- {actionname} template:{template}");
}
public IActionResult List(int? id)
{
var path = Request.Path.Value;
return Content($"List- Path:{path}");
}
}
Karma yönlendirme: Öznitelik yönlendirme ile geleneksel yönlendirme karşılaştırması
ASP.NET Core uygulamaları geleneksel yönlendirme ve öznitelik yönlendirme kullanımını bir şekilde karıştırabilirsiniz. Tipik olarak tarayıcılar için HTML sayfaları sunan denetleyiciler için geleneksel yollar ve REST API'leri sunan denetleyiciler için öznitelik yönlendirme kullanılır.
Eylemler geleneksel olarak yönlendirilen veya öznitelik yönlendirilen eylemlerdir. Denetleyiciye yol veya eylem yerleştirerek özniteliğini yönlendirin. Öznitelik yollarını tanımlayan eylemlere geleneksel yollar üzerinden (veya tam tersi) ulaşamaz. *Denetleyicide herhangi bir _ route özniteliği, denetleyici özniteliğinde _ tüm * eylemlerini yönlendirdi.
Öznitelik yönlendirme ve geleneksel yönlendirme aynı yönlendirme altyapısını kullanır.
URL Oluşturma ve ortam değerleri
Uygulamalar, eylemlere URL bağlantıları oluşturmak için yönlendirme URL'si oluşturma özelliklerini kullanabilir. URL oluşturmak sabit kodlama URL'lerini ortadan kaldırarak kodu daha sağlam ve bakımı kolay hale getirebilirsiniz. Bu bölüm, MVC tarafından sağlanan URL oluşturma özelliklerine odaklanır ve yalnızca URL oluşturmanın nasıl çalıştığının temellerini içerir. URL oluşturmanın ayrıntılı açıklaması için bkz. Yönlendirme.
Arabirim, IUrlHelper MVC ile URL oluşturma yönlendirmesi arasındaki altyapının temel öğesidir. bir örneği IUrlHelper denetleyiciler, Url görünümler ve görünüm bileşenlerinde özelliği aracılığıyla kullanılabilir.
Aşağıdaki örnekte, arabirimi IUrlHelper özelliği aracılığıyla başka bir Controller.Url eylemin URL'sini oluşturmak için kullanılır.
public class UrlGenerationController : Controller
{
public IActionResult Source()
{
// Generates /UrlGeneration/Destination
var url = Url.Action("Destination");
return ControllerContext.MyDisplayRouteInfo("", $" URL = {url}");
}
public IActionResult Destination()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Uygulama varsayılan geleneksel yolu kullanıyorsa değişkeninin değeri url URL yol /UrlGeneration/Destination dizesidir. Bu URL yolu, aşağıdakiler birleştirerek yönlendirme tarafından oluşturulur:
- Geçerli istekten gelen ve ortam değerleri olarak adlandırılan yol değerleri.
- Geçirilen ve
Url.Actionbu değerleri yol şablonuna alan değerler:
ambient values: { controller = "UrlGeneration", action = "Source" }
values passed to Url.Action: { controller = "UrlGeneration", action = "Destination" }
route template: {controller}/{action}/{id?}
result: /UrlGeneration/Destination
Yol şablonunda her yol parametresinin değerinin yerine değerleri ve ortam değerleriyle eşleşen adlar kullanılır. Değeri olmayan bir yol parametresi şunları olabilir:
- Varsa varsayılan bir değer kullanın.
- İsteğe bağlı ise atlanabilir. Örneğin,
idyol şablonundan{controller}/{action}/{id?}.
Gerekli yol parametresi karşılık gelen bir değere sahip olmazsa URL oluşturma başarısız olur. Bir yol için URL oluşturma başarısız olursa, tüm yollar denenene veya bir eşleşme bulunana kadar sonraki yol denenr.
Yukarıdaki örnek, geleneksel Url.Action yönlendirme varsayıyor. URL oluşturma, öznitelik yönlendirme ile benzer şekilde çalışır,ancak kavramlar farklıdır. Geleneksel yönlendirme ile:
- Yol değerleri bir şablonu genişletmek için kullanılır.
- ve için yol değerleri
controlleractiongenellikle bu şablonda görünür. Bunun nedeni yönlendirme tarafından eşilen URL'lerin bir kurala uymasıdır.
Aşağıdaki örnekte öznitelik yönlendirmesi kullanılır:
public class UrlGenerationAttrController : Controller
{
[HttpGet("custom")]
public IActionResult Source()
{
var url = Url.Action("Destination");
return ControllerContext.MyDisplayRouteInfo("", $" URL = {url}");
}
[HttpGet("custom/url/to/destination")]
public IActionResult Destination()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Yukarıdaki Source kodda yer alan eylem tarafından custom/url/to/destination oluşturulur.
LinkGeneratoralternatif olarak ASP.NET Core 3.0'a IUrlHelper eklendi. LinkGenerator benzer ancak daha esnek işlevsellik sunar. üzerinde her IUrlHelper yönteme karşılık gelen bir yöntem ailesi de LinkGenerator vardır.
Eylem adına göre URL oluşturma
Url.Action, LinkGenerator.GetPathByActionve tüm ilgili aşırı yüklemelerin hepsi bir denetleyici adı ve eylem adı belirterek hedef uç noktayı oluşturmak için tasarlanmıştır.
kullanılırken Url.Action ve için geçerli yol değerleri çalışma zamanı tarafından controller action sağlanır:
- ve değeri hem
controlleractionortam değerlerinin hem de değerlerinin bir parçası. yöntemiUrl.Actionher zaman geçerli ve değerleriniactionkullanır vecontrollergeçerli eyleme yönlendiren bir URL yolu üretir.
Yönlendirme, URL oluşturmada sağlanacak bilgileri doldurmak için çevresel değerlerde değerleri kullanmaya çalışır. Ortam değerleriyle gibi {a}/{b}/{c}/{d} bir yol { a = Alice, b = Bob, c = Carol, d = David } düşünün:
- Yönlendirme, ek değer olmadan BIR URL oluşturmak için yeterli bilgiye sahiptir.
- Tüm yol parametreleri bir değere sahip olduğundan yönlendirme yeterli bilgiye sahip.
Değer { d = Donovan } eklenirse:
- Değer
{ d = David }yoksayılır. - Oluşturulan URL yolu:
Alice/Bob/Carol/Donovan.
Uyarı: URL yolları hiyerarşiktir. Yukarıdaki örnekte, değer { c = Cheryl } ekleniyorsa:
- Değerlerin her ikisi de
{ c = Carol, d = David }yoksayılır. - Artık için bir değer yoktur ve
dURL oluşturma başarısız olur. - URL oluşturmak için
cistenen veddeğerleri belirtilmelidir.
Varsayılan yol ile bu soruna isabet etmek bekliyor {controller}/{action}/{id?} olabilir. Bir ve değerini her zaman açıkça Url.Action belirttiği için bu sorun pratikte controller action nadirdir.
Birçok Url.Action aşırı yüklemesi, ve dışında yol parametreleri için değer sağlamak için bir yol değerleri nesnesi controller action alır. Yol değerleri nesnesi sıklıkla ile id kullanılır. Örneğin, Url.Action("Buy", "Products", new { id = 17 }). Yol değerleri nesnesi:
- Kurala göre genellikle anonim türde bir nesnedir.
- bir veya
IDictionary<>POCO olabilir).
Yol parametreleriyle eşleşmeen ek yol değerleri sorgu dizesine yer alır.
public IActionResult Index()
{
var url = Url.Action("Buy", "Products", new { id = 17, color = "red" });
return Content(url!);
}
Yukarıdaki kod tarafından /Products/Buy/17?color=red oluşturulur.
Aşağıdaki kod mutlak bir URL üretir:
public IActionResult Index2()
{
var url = Url.Action("Buy", "Products", new { id = 17 }, protocol: Request.Scheme);
// Returns https://localhost:5001/Products/Buy/17
return Content(url!);
}
Mutlak BIR URL oluşturmak için, aşağıdakilerden birini kullanın:
- kabul eden bir aşırı
protocolyükleme. Örneğin, önceki kod. - Varsayılan olarak mutlak URI'ler oluşturan LinkGenerator.GetUriByAction.
Url'leri yönlendirmeye göre oluşturma
Yukarıdaki kod, denetleyiciyi ve eylem adını geçerek BIR URL oluşturma işlemi gösterdi. IUrlHelper ayrıca Url.RouteUrl yöntem ailesini de sağlar. Bu yöntemler Url.Action'abenzer, ancak geçerli ve değerlerini yol action controller değerlerine kopyalamaz. En yaygın Url.RouteUrl kullanımı:
- URL'yi oluşturmak için bir yol adı belirtir.
- Genellikle bir denetleyici veya eylem adı belirtmez.
public class UrlGeneration2Controller : Controller
{
[HttpGet("")]
public IActionResult Source()
{
var url = Url.RouteUrl("Destination_Route");
return ControllerContext.MyDisplayRouteInfo("", $" URL = {url}");
}
[HttpGet("custom/url/to/destination2", Name = "Destination_Route")]
public IActionResult Destination()
{
return ControllerContext.MyDisplayRouteInfo();
}
Aşağıdaki Razor dosya, için bir HTML bağlantısı Destination_Route üretir:
<h1>Test Links</h1>
<ul>
<li><a href="@Url.RouteUrl("Destination_Route")">Test Destination_Route</a></li>
</ul>
HTML'de URL'ler oluşturma ve Razor
IHtmlHelper sırasıyla HtmlHelper ve öğelerini oluşturmak için Html.BeginForm ve Html.ActionLink <form> yöntemlerini <a> sağlar. Bu yöntemler URL oluşturmak için Url.Action yöntemini kullanır ve benzer bağımsız değişkenleri kabul eder. için Url.RouteUrl yardımcıları HtmlHelper ve benzer Html.BeginRouteForm Html.RouteLink işlevlere sahip olandır.
TagHelpers, form TagHelper ve <a> TagHelper aracılığıyla URL'ler üretir. Bunların her ikisi de IUrlHelper uygulamaları için kullanır. Daha fazla bilgi için bkz. Formlarda Etiket Yardımcıları.
Görünümlerin IUrlHelper içinde, yukarıdakiler Url kapsamında olmayan geçici URL oluşturma için özelliği aracılığıyla kullanılabilir.
Eylem Sonuçlarında URL oluşturma
Yukarıdaki örneklerde, bir IUrlHelper denetleyicide kullanımı gösterildi. Denetleyicide en yaygın kullanım, eylem sonucu kapsamında BIR URL oluşturmaktır.
ve ControllerBase temel Controller sınıfları, başka bir eyleme başvurulan eylem sonuçları için kullanışlı yöntemler sağlar. Tipik kullanımlardan biri, kullanıcı girişi kabul edildikten sonra yeniden yönlendirmedir:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(int id, Customer customer)
{
if (ModelState.IsValid)
{
// Update DB with new details.
ViewData["Message"] = $"Successful edit of customer {id}";
return RedirectToAction("Index");
}
return View(customer);
}
Eylem, gibi fabrika yöntemlerinin sonuçlarını RedirectToAction CreatedAtAction verir ve üzerinde yöntemlerine benzer bir desen IUrlHelper kullanır.
Ayrılmış geleneksel yollar için özel durum
Geleneksel yönlendirme, ayrılmış geleneksel yol olarak adlandırılan özel bir yol tanımı kullanabilir. Aşağıdaki örnekte, adlı yol ayrılmış blog bir geleneksel rotadır:
app.MapControllerRoute(name: "blog",
pattern: "blog/{*article}",
defaults: new { controller = "Blog", action = "Article" });
app.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Önceki yol tanımlarını Url.Action("Index", "Home") kullanarak, yolu kullanarak URL yolunu / default üretir, ancak neden? Rota değerlerinin kullanarak { controller = Home, action = Index } BIR URL oluşturmak için yeterli olacağını ve blog sonucun olduğunu tahmin edersiniz. /blog?action=Index&controller=Home
Ayrılmış geleneksel yollar, varsayılan değerlerin özel bir davranışını kullanır ve buna karşılık gelen bir yol parametresine sahip değildir ve bu da yolu URL oluşturmada fazla doyumsuz bir şekilde engellemez. Bu durumda varsayılan değerler , ve { controller = Blog, action = Article } ne de yol parametresi olarak controller action görünür. Yönlendirme URL oluşturma işlemi gerçekleştirecek olduğunda, sağlanan değerlerin varsayılan değerlerle eşleşmesi gerekir. kullanılarak URL blog oluşturma başarısız olur çünkü değerler ile { controller = Home, action = Index } { controller = Blog, action = Article } eşleşmez. Yönlendirme daha sonra başarılı olan default denemesi için geri döner.
Alanlar
Alanlar, ilgili işlevleri ayrı bir grup halinde düzenlemek için kullanılan bir MVC özelliğidir:
- Denetleyici eylemleri için ad alanını yönlendirme.
- Görünümler için klasör yapısı.
Alanları kullanmak, farklı alanlara sahip olduğu sürece bir uygulamanın aynı adla birden çok denetleyiciye sahip olmasına olanak sağlar. Alanları kullanmak, ve 'ye başka bir yol parametresi ekleyerek yönlendirme amacıyla bir area hiyerarşi controller action oluşturur. Bu bölümde yönlendirmenin alanlarla nasıl etkileşim kurduğu ele almaktadır. Alanların görünümlerle nasıl kullanıldıklarına ilişkin ayrıntılar için bkz. Alanlar.
Aşağıdaki örnek, MVC'yi varsayılan geleneksel yolu ve adlandırılmış bir yolu area kullanmak üzere area Blog yapılandırıyor:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapAreaControllerRoute("blog_route", "Blog",
"Manage/{controller}/{action}/{id?}");
app.MapControllerRoute("default_route", "{controller}/{action}/{id?}");
app.Run();
Yukarıdaki kodda, MapAreaControllerRoute oluşturmak için çağrılır. "blog_route" İkinci parametre olan "Blog" , alan adıdır.
gibi bir URL yolu /Manage/Users/AddUser "blog_route" eşlerken yol, yol değerlerini { area = Blog, controller = Users, action = AddUser } üretir. Yol area değeri için varsayılan bir değer tarafından area üretilen. tarafından oluşturulan yol MapAreaControllerRoute aşağıdakine eşdeğerdir:
app.MapControllerRoute("blog_route", "Manage/{controller}/{action}/{id?}",
defaults: new { area = "Blog" }, constraints: new { area = "Blog" });
app.MapControllerRoute("default_route", "{controller}/{action}/{id?}");
MapAreaControllerRoute , sağlanan alan adını (bu durumda) kullanmak için hem varsayılan area değeri hem de kısıtlamayı kullanarak bir yol Blog oluşturur. Varsayılan değer, rotanın her zaman üretmesini { area = Blog, ... } sağlar. Kısıtlama, URL oluşturma { area = Blog, ... } için değer gerektirir.
Geleneksel yönlendirme, sıralamaya bağlıdır. Genel olarak, alanları olan yollar bir alanı olmayan yollara göre daha özel olduğu için daha erken yerleştirilleri gerekir.
Önceki örneği kullanarak, yol değerleri { area = Blog, controller = Users, action = AddUser } aşağıdaki eylemle eş değerlerle eş olur:
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace1
{
[Area("Blog")]
public class UsersController : Controller
{
// GET /manage/users/adduser
public IActionResult AddUser()
{
var area = ControllerContext.ActionDescriptor.RouteValues["area"];
var actionName = ControllerContext.ActionDescriptor.ActionName;
var controllerName = ControllerContext.ActionDescriptor.ControllerName;
return Content($"area name:{area}" +
$" controller:{controllerName} action name: {actionName}");
}
}
}
[Area] özniteliği, bir denetleyiciyi bir alan parçası olarak ifade eder. Bu denetleyici Blog alandadır. Özniteliği olmayan denetleyiciler herhangi bir alana üye değildir ve [Area] yönlendirme tarafından yol area değeri sağlanıyorsa eşleşmez. Aşağıdaki örnekte, yalnızca listelenen ilk denetleyici yol değerleriyle eş { area = Blog, controller = Users, action = AddUser } olabilir.
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace1
{
[Area("Blog")]
public class UsersController : Controller
{
// GET /manage/users/adduser
public IActionResult AddUser()
{
var area = ControllerContext.ActionDescriptor.RouteValues["area"];
var actionName = ControllerContext.ActionDescriptor.ActionName;
var controllerName = ControllerContext.ActionDescriptor.ControllerName;
return Content($"area name:{area}" +
$" controller:{controllerName} action name: {actionName}");
}
}
}
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace2
{
// Matches { area = Zebra, controller = Users, action = AddUser }
[Area("Zebra")]
public class UsersController : Controller
{
// GET /zebra/users/adduser
public IActionResult AddUser()
{
var area = ControllerContext.ActionDescriptor.RouteValues["area"];
var actionName = ControllerContext.ActionDescriptor.ActionName;
var controllerName = ControllerContext.ActionDescriptor.ControllerName;
return Content($"area name:{area}" +
$" controller:{controllerName} action name: {actionName}");
}
}
}
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace3
{
// Matches { area = string.Empty, controller = Users, action = AddUser }
// Matches { area = null, controller = Users, action = AddUser }
// Matches { controller = Users, action = AddUser }
public class UsersController : Controller
{
// GET /users/adduser
public IActionResult AddUser()
{
var area = ControllerContext.ActionDescriptor.RouteValues["area"];
var actionName = ControllerContext.ActionDescriptor.ActionName;
var controllerName = ControllerContext.ActionDescriptor.ControllerName;
return Content($"area name:{area}" +
$" controller:{controllerName} action name: {actionName}");
}
}
}
Her denetleyicinin ad alanı, bütünlük için burada gösterilir. Yukarıdaki denetleyiciler aynı ad alanını kullanırsa bir derleyici hatası oluşturulur. Sınıf ad alanlarının MVC'nin yönlendirmesi üzerinde hiçbir etkisi yoktur.
İlk iki denetleyici alanların üyeleridir ve yalnızca ilgili alan adı yol değeri tarafından area sağlanıyorsa eşler. Üçüncü denetleyici herhangi bir alana üye değil ve yalnızca yönlendirme tarafından için hiçbir değer area sağlanamıyorsa eş olabilir.
Hiçbir değer ile eşleşmeme açısından, değerinin area olmaması, değerinin null veya boş dize area olmasıyla aynıdır.
Bir alan içinde bir eylem yürütilirken, için yol değeri, URL oluşturma için kullanmak üzere area yönlendirme için bir ortam değeri olarak kullanılabilir. Bu, varsayılan olarak alanların URL oluşturma için aşağıdaki örnekte olduğu gibi yapışkan davranacakları anlamına gelir.
app.MapAreaControllerRoute(name: "duck_route",
areaName: "Duck",
pattern: "Manage/{controller}/{action}/{id?}");
app.MapControllerRoute(name: "default",
pattern: "Manage/{controller=Home}/{action=Index}/{id?}");
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace4
{
[Area("Duck")]
public class UsersController : Controller
{
// GET /Manage/users/GenerateURLInArea
public IActionResult GenerateURLInArea()
{
// Uses the 'ambient' value of area.
var url = Url.Action("Index", "Home");
// Returns /Manage/Home/Index
return Content(url);
}
// GET /Manage/users/GenerateURLOutsideOfArea
public IActionResult GenerateURLOutsideOfArea()
{
// Uses the empty value for area.
var url = Url.Action("Index", "Home", new { area = "" });
// Returns /Manage
return Content(url);
}
}
}
Aşağıdaki kod, url'sini /Zebra/Users/AddUser üretir:
public class HomeController : Controller
{
public IActionResult About()
{
var url = Url.Action("AddUser", "Users", new { Area = "Zebra" });
return Content($"URL: {url}");
}
Eylem tanımı
Denetleyicide NonAction özniteliğine sahip olanlar dışında genel yöntemler eylemlerdir.
Örnek kod
- Mydisplayrouteınfo , Rick.Docs. Samples. routeınfo NuGet paketi tarafından sağlanır ve rota bilgilerini görüntüler.
- Örnek kodu görüntüleme veya indirme ( nasılindir)
Hata ayıklama tanılaması
Ayrıntılı yönlendirme tanılama çıktısı için, Logging:LogLevel:Microsoft olarak ayarlayın Debug . Geliştirme ortamında, appsettings.Development.jsüzerindeki günlük düzeyini ayarlayın:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Debug",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
ASP.NET Core denetleyicileri, gelen isteklerin URL'lerini eşlemek ve bunları eylemlerle eşlemek için Yönlendirme ara yazılımı kullanır. Yol şablonları:
- Başlangıç kodunda veya özniteliklerde tanımlanır.
- URL yollarının eylemlerle nasıl eş olduğunu açık olun.
- Bağlantılar için URL'ler oluşturmak için kullanılır. Oluşturulan bağlantılar genellikle yanıtlarda döndürülür.
Eylemler geleneksel olarak yönlendirilen veya öznitelik ile yönlendirilen eylemlerdir. Denetleyiciye veya eyleme yol yerleştirmek, yolu attribute-routed yapar. Daha fazla bilgi için bkz. Karma yönlendirme.
Bu belge:
- MVC ile yönlendirme arasındaki etkileşimleri açıklar:
- Tipik MVC uygulamaları yönlendirme özelliklerini nasıl kullanır?
- Her ikisini de kapsar:
- Geleneksel yönlendirme genellikle denetleyiciler ve görünümlerle kullanılır.
- REST API'lerle kullanılan öznitelik yönlendirme. Öncelikli olarak REST API'leri yönlendirmeyle ilgileniyorsanız REST API'ler için öznitelik yönlendirme bölümüne atlayın.
- Gelişmiş yönlendirme ayrıntıları için bkz. Yönlendirme.
- Uç nokta yönlendirme olarak adlandırılan ASP.NET Core 3.0'a eklenen varsayılan yönlendirme sistemini ifade eder. Uyumluluk amacıyla, yönlendirmenin önceki sürümüyle denetleyicileri kullanmak mümkündür. Yönergeler için bkz. 2.2-3.0 geçiş kılavuzu. Eski yönlendirme sistemiyle ilgili başvuru malzemeleri için bu belgenin 2.2 sürümüne bakın.
Geleneksel rotayı ayarlama
Startup.Configuregenellikle geleneksel yönlendirme kullanılırken aşağıdakine benzer bir koda sahip olur:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
çağrısının UseEndpoints MapControllerRoute içinde, tek bir yol oluşturmak için kullanılır. Tek yol route olarak default adlandırılmış. Denetleyicilere ve görünümlere sahip uygulamaların çoğu, yol gibi bir yol şablonu default kullanır. REST API'leri öznitelik yönlendirmeyi kullandır.
Yol "{controller=Home}/{action=Index}/{id?}" şablonu:
Gibi bir URL yolu ile eşler
/Products/Details/5Yolu belirteçleştirerek
{ controller = Products, action = Details, id = 5 }yol değerlerini ayıklar. Uygulamanın adlı bir denetleyicisi ve eylemi varsa yol değerlerinin ayıklamasıProductsControllereşleşmeye nedenDetailsolur:public class ProductsController : Controller { public IActionResult Details(int id) { return ControllerContext.MyDisplayRouteInfo(id); } }Mydisplayrouteınfo , Rick.Docs. Samples. routeınfo NuGet paketi tarafından sağlanır ve rota bilgilerini görüntüler.
/Products/Details/5model, parametresini olarakid = 5ayarlamak içiniddeğerini5bağlar. Diğer ayrıntılar için bkz. Model Bağlama.{controller=Home}varsayılanHomeolarakcontrollertanımlar.{action=Index}varsayılanIndexolarakactiontanımlar.içinde
?karakteri{id?}isteğe bağlı olarakidtanımlar.Varsayılan ve isteğe bağlı yol parametrelerinin eşleşme için URL yolunda mevcut olması gerekli değildir. Yol şablonu söz dizimlerinin ayrıntılı açıklaması için bkz. Yol Şablonu Başvurusu.
URL yolu ile
/eşler.Yol değerlerini
{ controller = Home, action = Index }üretir.
ve değerleri controller action varsayılan değerleri kullanır. id URL yolunda karşılık gelen bir kesim olduğundan değer üretmez. / yalnızca bir ve eylemi varsa HomeController Index eşler:
public class HomeController : Controller
{
public IActionResult Index() { ... }
}
Yukarıdaki denetleyici tanımı ve yol şablonu HomeController.Index kullanılarak, eylem aşağıdaki URL yolları için uyarlanmıştır:
/Home/Index/17/Home/Index/Home/
URL yolu, / yol şablonu varsayılan denetleyicilerini ve Home eylemlerini Index kullanır. URL /Home yolu, yol şablonu varsayılan eylemlerini Index kullanır.
Kolaylık MapDefaultControllerRoute yöntemi:
endpoints.MapDefaultControllerRoute();
Değiştirir:
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
Önemli
Yönlendirme , ve ara UseRouting yazılımı MapControllerRoute kullanılarak MapAreaControllerRoute yapılandırılır. Denetleyicileri kullanmak için:
- Öznitelik MapControllers
UseEndpointsyönlendirilen denetleyicileri eşlemek için içinde çağrısı. - Hem MapControllerRoute geleneksel MapAreaControllerRoute olarak yönlendirilen denetleyicileri hem de öznitelik yönlendirilen denetleyicileri eşlemek için veya çağrısı.
Geleneksel yönlendirme
Geleneksel yönlendirme, denetleyiciler ve görünümlerle birlikte kullanılır. defaultYol:
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Yukarıdaki, geleneksel bir yol örneğidir. URL yolları için bir kural kurduğu için geleneksel yönlendirme olarak adlandırılan bu kural:
- İlk yol kesimi olan
{controller=Home}, denetleyici adına eşler. - İkinci segment olan
{action=Index}, eylem adıyla eşler. - Üçüncü segment,
{id?}isteğe bağlı içinidkullanılır. in,?{id?}isteğe bağlı yapar.idbir model varlığa eşlemek için kullanılır.
Bu yolu default kullanarak URL yolu:
/Products/ListeylemeProductsController.Listeşler./Blog/Article/17ve ileBlogController.Articleeşler ve genellikle modelidparametresini 17'ye bağlar.
Bu eşleme:
- Yalnızca denetleyiciyi ve eylem adlarını temel alıyor.
- Ad alanlarını, kaynak dosya konumlarını veya yöntem parametrelerini temel alan bir yöntem değildir.
Varsayılan yol ile geleneksel yönlendirme kullanmak, her eylem için yeni bir URL deseni oluşturmak zorunda kalmadan uygulamanın oluşturulmasına olanak sağlar. CRUD stili eylemleri olan bir uygulama için, denetleyiciler arasında URL'ler için tutarlılık elde edin:
- Kodu basitleştirmeye yardımcı olur.
- Kullanıcı arabirimini daha öngörülebilir hale sağlar.
Uyarı
Yukarıdaki id kodda, yol şablonu tarafından isteğe bağlı olarak tanımlanır. Eylemler, URL'nin bir parçası olarak sağlanan isteğe bağlı kimlik olmadan yürütülebilirsiniz. Genellikle, id URL'den atlanırsa:
id, model bağlama0tarafından olarak ayarlanır.- ile eşleşen veritabanında varlık
id == 0bulunamadı.
Öznitelik yönlendirme, bazı eylemler için gerekli olan kimliğin başkaları için değil, bazı eylemler için gerekli olması için ince denetim sağlar. Kural gereği belgeler, doğru kullanımda id görünseler gibi isteğe bağlı parametreler içerir.
Çoğu uygulama, URL'lerin okunabilir ve anlamlı olması için temel ve açıklayıcı bir yönlendirme şeması seçmeli. Varsayılan geleneksel {controller=Home}/{action=Index}/{id?} yol:
- Temel ve açıklayıcı bir yönlendirme şemasını destekler.
- Kullanıcı arabirimi tabanlı uygulamalar için kullanışlı bir başlangıç noktasıdır.
- Birçok web kullanıcı arabirimi uygulaması için gereken tek yol şablonudur. Daha büyük web kullanıcı arabirimi uygulamaları için Alanlar'ı kullanan başka bir yol genellikle tek gerekendir.
MapControllerRoute ve MapAreaRoute :
- Çağrılan sıraya göre uç noktalarına otomatik olarak bir sipariş değeri attayın.
3.0 ve ASP.NET Core uç nokta yönlendirme:
- Yol kavramına sahip değildir.
- Genişletilebilirlik yürütmesi için sipariş garantileri sağlamaz, tüm uç noktalar aynı anda işlenir.
Gibi yerleşik yönlendirme uygulamalarının isteklere nasıl eş olduğunu görmek için Günlüğe Route Kaydetme'yi etkinleştirin.
Öznitelik yönlendirmesi bu belgenin devamlarında açıklanmıştır.
Birden çok geleneksel yol
ve 'ye daha fazla çağrı UseEndpoints ekleniyorsa, içine birden çok geleneksel yol MapControllerRoute MapAreaControllerRoute eklenebilir. Bunu yapmak birden çok kural tanımlamaya veya belirli bir eyleme ayrılmış geleneksel yollar eklemeye olanaksağlar, örneğin:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "blog",
pattern: "blog/{*article}",
defaults: new { controller = "Blog", action = "Article" });
endpoints.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Yukarıdaki blog kodda yer alan yol, ayrılmış bir geleneksel yoldur. Ayrılmış geleneksel yol olarak adlandırılan bu yol şu şekildedir:
- Geleneksel yönlendirme kullanır.
- Belirli bir eyleme ayrılmıştır.
çünkü controller action ve yol şablonunda parametre "blog/{*article}" olarak görünmez:
- Yalnızca varsayılan değerlerine sahip
{ controller = "Blog", action = "Article" }olabilir. - Bu yol her zaman eylemiyle
BlogController.Articleeşler.
/Blog, /Blog/Article ve , blog /Blog/{any-string} yoluyla eşan tek URL yollarıdır.
Yukarıdaki örnek:
blogrota, ilk olarak eklendiklerine göre eşleşmeler içindefaultyoldan daha yüksek önceliğe sahiptir.- Url'nin bir parçası olarak makale adının olduğu bir Örnek olarak, Slug stili yönlendirme örneğidir.
Uyarı
3 ASP.NET Core 3.0 ve sonraki bir sonraki bir zaman için yönlendirme şu şekildedir:
- route adlı bir kavram tanımlayın.
UseRoutingara yazılım işlem hattına yol eşleştirme ekler. AraUseRoutingyazılım, uygulamada tanımlanan uç nokta kümesine bakarak itene göre en iyi uç nokta eşleşmesi seçeneğini belirtir. - veya gibi genişletilebilirlik yürütme sırası hakkında IRouteConstraint garantiler IActionConstraint sağlar.
Yönlendirmeyle ilgili başvuru malzemeleri için bkz. Yönlendirme.
Geleneksel yönlendirme sırası
Geleneksel yönlendirme yalnızca uygulama tarafından tanımlanan eylem ve denetleyici birleşimiyle eşler. Bu, geleneksel yolların çakışması durumlarını basitleştirmek için tasarlanmıştır.
, ve kullanarak MapControllerRoute yollar MapDefaultControllerRoute ekleme ve MapAreaControllerRoute çağrılan sırayla uç noktalarına otomatik olarak bir sipariş değeri atama. Daha önce görünen bir yol eşleşmeleri daha yüksek önceliğe sahiptir. Geleneksel yönlendirme, sıralamaya bağlıdır. Genel olarak, alanları olan yollar bir alanı olmayan yollara göre daha özel olduğu için daha erken yerleştirilleri gerekir. gibi tüm yolları yakala yol parametrelerine sahip ayrılmış geleneksel yollar, bir yolu fazla doyumsuz hale deterek diğer yollar tarafından eşleşmeyi amaçlanan URL'lerle eş {*article} hale gelir. Doyumsuz eşleşmeleri önlemek için doyumsuz yolları yol tablosuna daha sonra koyabilirsiniz.
Uyarı
Bir catch-all parametresi, yönlendirdeki bir hata nedeniyle yollarla yanlış bir şekilde eşleşmeyebilir. Bu hatadan etkilenen uygulamalar aşağıdaki özelliklere sahiptir:
- Örneğin, bir catch-all rotası
{**slug}" - Catch-all yolu eşleşmesi gereken isteklerle eşleşemez.
- Diğer yolların kaldırılması, catch-all yolunun çalışmaya başlamasını sağlar.
Bu hataya vurmakta olan örnekler için GitHub hataları 18677 ve 16579 bakın.
Bu hata için bir katılım çözümü .NET Core 3.1.301 SDK ve sonraki sürümlerdebulunur. Aşağıdaki kod, bu hatayı düzelten bir iç anahtar ayarlar:
public static void Main(string[] args)
{
AppContext.SetSwitch("Microsoft.AspNetCore.Routing.UseCorrectCatchAllBehavior",
true);
CreateHostBuilder(args).Build().Run();
}
// Remaining code removed for brevity.
Belirsiz eylemleri çözme
Yönlendirme aracılığıyla iki uç nokta eşlenin, yönlendirmenin aşağıdakilerden birini yapmaları gerekir:
- En iyi adayı seçin.
- Bir özel durum oluşturur.
Örnek:
public class Products33Controller : Controller
{
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpPost]
public IActionResult Edit(int id, Product product)
{
return ControllerContext.MyDisplayRouteInfo(id, product.name);
}
}
}
Yukarıdaki denetleyici, ile eşan iki eylem tanımlar:
- URL yolu
/Products33/Edit/17 - Verileri
{ controller = Products33, action = Edit, id = 17 }yönlendirme.
Bu, MVC denetleyicileri için tipik bir desendir:
Edit(int), bir ürünü düzenlemek için bir form görüntüler.Edit(int, Product), gönderilen formu işlemeye devam ediyor.
Doğru yolu çözümlemek için:
Edit(int, Product)istek bir HTTP olduğundaPOSTseçilir.Edit(int)HTTP fiili başka bir şey olduğunda seçilir.Edit(int)genellikle aracılığıylaGETçağrılır.
HttpPostAttribute, [HttpPost] , isteğin HTTP yöntemine göre seçim yapmak için yönlendirmeye sağlanır. , HttpPostAttribute yerine daha iyi bir eşleşme Edit(int, Product) Edit(int) yapar.
gibi özniteliklerin rolünü anlamak HttpPostAttribute önemlidir. Benzer öznitelikler diğer HTTP fiilleri için tanımlanır. Geleneksel yönlendirmede,eylemlerin bir gösterme formunun parçası olduğunda aynı eylem adını kullanmaları ve form iş akışı göndermeleri yaygındır. Örneğin, bkz. İki Düzenleme eylemi yöntemini inceleme.
Yönlendirme en iyi adayı seçenene kadar, birden çok eşleşmesi olan uç AmbiguousMatchException noktayı listeleye bir atılan bir olur.
Geleneksel rota adları
Dizeler "blog" ve "default" aşağıdaki örneklerde geleneksel yol adları verilmiştir:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "blog",
pattern: "blog/{*article}",
defaults: new { controller = "Blog", action = "Article" });
endpoints.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Yol adları, yol için mantıksal bir ad gösterir. Adlandırılmış yol, URL oluşturma için kullanılabilir. Adlandırılmış bir yol kullanmak, yolların sıra kurulması URL oluşturmanın karmaşık hale geldiğinde URL oluşturmasını basitleştiriyor. Yol adları uygulama genelinde benzersiz olmalıdır.
Yol adları:
- URL eşleştirme veya isteklerin işlenmesi üzerinde hiçbir etkisi yoktur.
- Yalnızca URL oluşturma için kullanılır.
Yol adı kavramı yönlendirmede IEndpointNameMetadata olarak temsil edildi. Yol adı ve uç nokta adı terimleri:
- Birbirinin yerine kullanılabilir.
- Belgelerde ve kodda kullanılan api, açıklanan API'ye bağlıdır.
REST API'leri için öznitelik yönlendirme
REST API'leri, uygulamanın işlevselliğini işlemlerin HTTP fiilleri ile temsil edilen bir kaynak kümesi olarak modellemek için öznitelik yönlendirmeyi kullandır.
Öznitelik yönlendirme, eylemleri doğrudan yönlendirme şablonlarıyla eşlemek için bir öznitelik kümesi kullanır. Aşağıdaki StartUp.Configure kod, bir REST API için tipiktir ve sonraki örnekte kullanılır:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Önceki kodda, MapControllers özniteliği yönlendirilen denetleyicileri UseEndpoints eşlemek için içinde çağrılır.
Aşağıdaki örnekte:
HomeController, varsayılan geleneksel yol ile eşleşene benzer bir URL{controller=Home}/{action=Index}/{id?}kümesiyle eştir.
public class HomeController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
[Route("Home/Index/{id?}")]
public IActionResult Index(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[Route("Home/About")]
[Route("Home/About/{id?}")]
public IActionResult About(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Eylemi HomeController.Index , , veya URL yollarının herhangi biri için / /Home /Home/Index çalıştır. /Home/Index/3
Bu örnek, öznitelik yönlendirme ile geleneksel yönlendirme arasındaki önemli bir programlama farkını vurgular. Öznitelik yönlendirme, yol belirtmek için daha fazla giriş gerektirir. Geleneksel varsayılan yol, yolları daha kısa bir şekilde işlemeye devam ediyor. Ancak, öznitelik yönlendirmesi her bir eylem için hangi yol şablonlarının geçerli olduğunu tam olarak denetlemeyi sağlar ve gerektirir.
Öznitelik yönlendirmede denetleyici ve eylem adları, belirteç değiştirme kullanılmadıkça eylemin eş olduğu bir rol oynamaz. Aşağıdaki örnek, önceki örnekle aynı URL'ler ile eştir:
public class MyDemoController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
[Route("Home/Index/{id?}")]
public IActionResult MyIndex(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[Route("Home/About")]
[Route("Home/About/{id?}")]
public IActionResult MyAbout(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Aşağıdaki kod ve için belirteç değiştirme action controller kullanır:
public class HomeController : Controller
{
[Route("")]
[Route("Home")]
[Route("[controller]/[action]")]
public IActionResult Index()
{
return ControllerContext.MyDisplayRouteInfo();
}
[Route("[controller]/[action]")]
public IActionResult About()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Aşağıdaki kod denetleyici [Route("[controller]/[action]")] için geçerlidir:
[Route("[controller]/[action]")]
public class HomeController : Controller
{
[Route("~/")]
[Route("/Home")]
[Route("~/Home/Index")]
public IActionResult Index()
{
return ControllerContext.MyDisplayRouteInfo();
}
public IActionResult About()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Yukarıdaki kodda, Index yöntem şablonlarının yol şablonlarının ön ucu / veya ön ~/ ucu gerekir. Ile başlayan veya denetleyiciye uygulanan yol şablonlarıyla birleştiri almayan / ~/ bir eyleme uygulanan yol şablonları.
Yol şablonu seçimi hakkında bilgi için bkz. Rota şablonu önceliği.
Ayrılmış yönlendirme adları
Aşağıdaki anahtar sözcükler, Denetleyiciler veya Sayfalar kullanılırken ayrılmış yol parametresi Razor adlarıdır:
actionareacontrollerhandlerpage
Öznitelik page yönlendirme ile yol parametresi olarak kullanmak yaygın bir hatadır. Bunu yapmak, URL oluşturmayla ilgili tutarsız ve kafa karıştırıcı bir davranışa neden olur.
public class MyDemo2Controller : Controller
{
[Route("/articles/{page}")]
public IActionResult ListArticles(int page)
{
return ControllerContext.MyDisplayRouteInfo(page);
}
}
Özel parametre adları, URL oluşturma işlemi bir Sayfaya mı yoksa Denetleyiciye mi başvurur? belirlemek için URL Razor oluşturma tarafından kullanılır.
- Aşağıdaki anahtar sözcükler bir görünüm veya Sayfa Razor bağlamında Razor ayrılmıştır:
pageusingnamespaceinjectsectioninheritsmodeladdTagHelperremoveTagHelper
Bu anahtar sözcükler bağlantı nesilleri, modele bağlı parametreler veya üst düzey özellikler için kullanılmaması gerekir.
HTTP fiili şablonları
ASP.NET Core HTTP fiili şablonları vardır:
Rota şablonları
ASP.NET Core yol şablonları vardır:
- Tüm HTTP fiili şablonları yol şablonlarıdır.
- [Yol]
Http fiil öznitelikleriyle öznitelik yönlendirme
Aşağıdaki denetleyiciyi düşünün:
[Route("api/[controller]")]
[ApiController]
public class Test2Controller : ControllerBase
{
[HttpGet] // GET /api/test2
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")] // GET /api/test2/xyz
public IActionResult GetProduct(string id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int/{id:int}")] // GET /api/test2/int/3
public IActionResult GetIntProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int2/{id}")] // GET /api/test2/int2/3
public IActionResult GetInt2Product(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yukarıdaki kodda:
- Her eylem,
[HttpGet]yalnızca HTTP GET istekleriyle eşleştirmeyi kısıtlar özniteliğini içerir. - Eylemi
GetProductşablonu"{id}"içerir, buidnedenle denetleyicide"api/[controller]"şablona eklenir. Yöntemler şablonu"api/[controller]/"{id}""şudur: . Bu nedenle bu eylem yalnızca/api/test2/xyz,,/api/test2/123vb. için get istekleri ile eşleşir/api/test2/{any string}.[HttpGet("{id}")] // GET /api/test2/xyz public IActionResult GetProduct(string id) { return ControllerContext.MyDisplayRouteInfo(id); } GetIntProductEylem"int/{id:int}")şablonu içerir.:intŞablonun kısmı,idyol değerlerini bir tamsayıya dönüştürülebileceği dizelere kısıtlar. Bir GET isteği/api/test2/int/abc:- Bu eylemle eşleşmiyor.
- Bir 404 bulunamadı hatası döndürür.
[HttpGet("int/{id:int}")] // GET /api/test2/int/3 public IActionResult GetIntProduct(int id) { return ControllerContext.MyDisplayRouteInfo(id); }
GetInt2ProductEylem şablonda bulunur{id}, ancakidbir tamsayıya dönüştürülemeyen değerlerle sınırlandırmaz. Bir GET isteği/api/test2/int2/abc:- Bu rota ile eşleşir.
- Model bağlama
abcbir tamsayıya dönüştürülemez.idYönteminin parametresi tamsayıdır. - Model bağlama bir tamsayıya dönüştürülemediğinden, 400 hatalı bir istek döndürür
abc.[HttpGet("int2/{id}")] // GET /api/test2/int2/3 public IActionResult GetInt2Product(int id) { return ControllerContext.MyDisplayRouteInfo(id); }
Öznitelik yönlendirme,, HttpMethodAttribute ve gibi öznitelikleri HttpPostAttribute kullanabilir HttpPutAttribute HttpDeleteAttribute . Tüm http fiili öznitelikleri bir yol şablonunu kabul eder. Aşağıdaki örnekte, aynı yol şablonuyla eşleşen iki eylem gösterilmektedir:
[ApiController]
public class MyProductsController : ControllerBase
{
[HttpGet("/products3")]
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpPost("/products3")]
public IActionResult CreateProduct(MyProduct myProduct)
{
return ControllerContext.MyDisplayRouteInfo(myProduct.Name);
}
}
URL yolu kullanılarak /products3 :
MyProductsController.ListProductsEylem http fiili olduğunda çalışırGET.MyProductsController.CreateProductEylem http fiili olduğunda çalışırPOST.
Bir REST API oluştururken, [Route(...)] eylem tüm http yöntemlerini kabul ettiğinden bir eylem yönteminde kullanmanız gerekecektir. API 'nizin neleri desteklediği hakkında kesin olması için, daha özel http fiili özniteliği kullanmak daha iyidir. REST API 'lerinin istemcileri, hangi yolların ve HTTP fiillerinin belirli mantıksal işlemlere eşlendiğini bilmelidir.
REST API 'Leri, uygulamanın işlevselliğini HTTP fiilleri tarafından temsil edilen bir kaynak kümesi olarak modellemek için öznitelik yönlendirmeyi kullanmalıdır. Bu, örneğin, aynı mantıksal kaynaktaki al ve postala gibi birçok işlemin aynı URL 'YI kullanması anlamına gelir. Öznitelik yönlendirme, bir API 'nin Genel uç nokta yerleşimini dikkatle tasarlamak için gereken bir denetim düzeyi sağlar.
Bir öznitelik yolu belirli bir eyleme uyguladığı için, yol şablonu tanımının bir parçası olarak gerekli parametreleri yapmak kolaydır. Aşağıdaki örnekte, id URL yolunun bir parçası olarak gereklidir:
[ApiController]
public class Products2ApiController : ControllerBase
{
[HttpGet("/products2/{id}", Name = "Products_List")]
public IActionResult GetProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Products2ApiController.GetProduct(int)Eylem:
- , Şunun gibi URL yoluyla çalıştırılır
/products2/3 - URL yoluyla çalıştırılmadı
/products2.
[Tüketir] özniteliği, desteklenen istek içerik türlerini sınırlama eylemi sağlar. Daha fazla bilgi için bkz. desteklenen istek içerik türlerini tüketir özniteliğiyle tanımlama.
Yol şablonlarının ve ilgili seçeneklerin tam açıklaması için bkz. yönlendirme .
Hakkında daha fazla bilgi için [ApiController] bkz. Apicontroller özniteliği.
Yönlendirme adı
Aşağıdaki kod, bir yol adı tanımlar Products_List :
[ApiController]
public class Products2ApiController : ControllerBase
{
[HttpGet("/products2/{id}", Name = "Products_List")]
public IActionResult GetProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yol adları, belirli bir yolu temel alan bir URL oluşturmak için kullanılabilir. Yol adları:
- Yönlendirmenin URL eşleşen davranışı üzerinde hiçbir etkisi yoktur.
- Yalnızca URL oluşturma için kullanılır.
Yol adları, uygulama genelinde benzersiz olmalıdır.
Önceki kodu, id parametreyi isteğe bağlı () olarak tanımlayan geleneksel varsayılan rotayla kontrast {id?} . API 'Leri tam olarak belirtme özelliği, farklı eylemlere izin verilmesi ve dağıtılması gibi avantajlara sahiptir /products /products/5 .
Öznitelik yollarını birleştirme
Öznitelik yönlendirmeyi daha az tekrarlı hale getirmek için, denetleyicideki yol öznitelikleri, bireysel eylemlerdeki rota öznitelikleriyle birleştirilir. Denetleyicide tanımlanan tüm yol şablonları, eylemlerdeki rota şablonlarına eklenir. Bir Route özniteliğinin denetleyiciye yerleştirilmesi, denetleyicideki Tüm eylemlerin öznitelik yönlendirme kullanmasını sağlar.
[ApiController]
[Route("products")]
public class ProductsApiController : ControllerBase
{
[HttpGet]
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")]
public IActionResult GetProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yukarıdaki örnekte:
- URL yolu
/productseşleşiyorProductsApi.ListProducts - URL yolu
/products/5eşleşiyorProductsApi.GetProduct(int).
Bu eylemlerin her ikisi de, özniteliğiyle işaretlendiğinden yalnızca HTTP ile eşleşir GET [HttpGet] .
Bir eyleme uygulanan / veya bu ~/ denetleyiciye uygulanan rota şablonlarıyla birlikte bir araya getirilen bir eyleme uygulanan rota şablonları. Aşağıdaki örnek, varsayılan rotaya benzer bir URL yolları kümesiyle eşleşir.
[Route("Home")]
public class HomeController : Controller
{
[Route("")]
[Route("Index")]
[Route("/")]
public IActionResult Index()
{
return ControllerContext.MyDisplayRouteInfo();
}
[Route("About")]
public IActionResult About()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Aşağıdaki tabloda [Route] önceki koddaki öznitelikler açıklanmaktadır:
| Öznitelik | İle birleştirir [Route("Home")] |
Rota şablonunu tanımlar |
|---|---|---|
[Route("")] |
Yes | "Home" |
[Route("Index")] |
Yes | "Home/Index" |
[Route("/")] |
Hayır | "" |
[Route("About")] |
Yes | "Home/About" |
Öznitelik yolu sırası
Yönlendirme bir ağaç oluşturur ve aynı anda tüm uç noktaları eşleştirir:
- Yol girdileri ideal bir sıralamaya yerleştirilmiş gibi davranır.
- En özel yolların, daha genel yollardan önce yürütülmesi şansınız vardır.
Örneğin, gibi bir öznitelik yolu, blog/search/{topic} gibi bir öznitelik rotasına göre daha özgüdür blog/{*article} . blog/search/{topic}Daha belirgin olduğundan, yolun önceliği daha yüksektir. Geleneksel yönlendirmeyikullanarak, yolları istenen sırada yerleştirmekten geliştirici sorumludur.
Öznitelik yolları özelliği kullanarak bir sıra yapılandırabilir Order . Tüm Framework 'ün yol öznitelikleri dahil edilmiştir Order . Yollar, özelliğin artan sıralamasına göre işlenir Order . Varsayılan sıra 0 . Bir Order = -1 siparişi ayarlamadığı rotalardan önce çalıştırmaları kullanarak bir rota ayarlama. Order = 1Varsayılan yol sıralaması sonrasında çalıştırmaları kullanarak bir rota ayarlama.
Uygulamasına bağlı kaçının Order . Bir uygulamanın URL 'SI alanı, doğru şekilde yönlendirmek için açık sıra değerleri gerektiriyorsa, bu durumda istemciler de kafa karıştırıcı olabilir. Genel olarak, öznitelik yönlendirme URL ile eşleşen doğru yolu seçer. URL oluşturma için kullanılan varsayılan sıra çalışmıyorsa, geçersiz kılma olarak bir yol adı kullanılması, özelliği uygulamadan daha basittir Order .
Her ikisi de eşleşen yolu tanımlayan aşağıdaki iki denetleyicisi göz önünde bulundurun /home :
public class HomeController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
[Route("Home/Index/{id?}")]
public IActionResult Index(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[Route("Home/About")]
[Route("Home/About/{id?}")]
public IActionResult About(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
public class MyDemoController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
[Route("Home/Index/{id?}")]
public IActionResult MyIndex(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[Route("Home/About")]
[Route("Home/About/{id?}")]
public IActionResult MyAbout(int? id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
/homeYukarıdaki kodla istemek şuna benzer bir özel durum oluşturur:
AmbiguousMatchException: The request matched multiple endpoints. Matches:
WebMvcRouting.Controllers.HomeController.Index
WebMvcRouting.Controllers.MyDemoController.MyIndex
OrderYol özniteliklerinden birine ekleme belirsizliği çözer:
[Route("")]
[Route("Home", Order = 2)]
[Route("Home/MyIndex")]
public IActionResult MyIndex()
{
return ControllerContext.MyDisplayRouteInfo();
}
Yukarıdaki kodla /home HomeController.Index bitiş noktasını çalıştırır. Öğesine ulaşmak için MyDemoController.MyIndex /home/MyIndex . Not:
- Yukarıdaki kod bir örnek veya kötü yönlendirme tasarımdır. Özelliği göstermek için kullanılmıştı
Order. OrderÖzelliği yalnızca belirsizlik çözümleniyor, bu şablon eşleştirilemez. Şablonu kaldırmak daha iyi olacaktır[Route("Home")].
Bkz. Razor sayfa yönlendirme ve uygulama kuralları: sayfalarla rota sıralaması hakkında bilgi için rota sırası Razor .
Bazı durumlarda, belirsiz yollarla bir HTTP 500 hatası döndürülür. Hangi uç noktaların neden olduğunu görmek için günlük kaydını kullanın AmbiguousMatchException .
Yönlendirme şablonlarında belirteç değiştirme [denetleyici], [eylem], [alan]
Daha kolay olması için, öznitelik rotaları bir belirteci köşeli ayraç (,) içine alarak belirteç değiştirmeyi destekler [ ] . , Ve belirteçleri, [action] [area] [controller] yolun tanımlandığı eylemden eylem adı, alan adı ve denetleyici adı değerleriyle değiştirilmiştir:
[Route("[controller]/[action]")]
public class Products0Controller : Controller
{
[HttpGet]
public IActionResult List()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")]
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yukarıdaki kodda:
[HttpGet]
public IActionResult List()
{
return ControllerContext.MyDisplayRouteInfo();
}
- Eşleştir
/Products0/List
[HttpGet("{id}")]
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
- Eşleştir
/Products0/Edit/{id}
Belirteç değişikliği, öznitelik yollarının oluşturulması için son adım olarak gerçekleşir. Yukarıdaki örnek aşağıdaki kodla aynı şekilde davranır:
public class Products20Controller : Controller
{
[HttpGet("[controller]/[action]")] // Matches '/Products20/List'
public IActionResult List()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("[controller]/[action]/{id}")] // Matches '/Products20/Edit/{id}'
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Bunu Ingilizce dışındaki bir dilde okuyorsanız, kod açıklamalarını yerel dilinizde görmek istiyorsanız bu GitHub tartışma sorununu bize gönderin.
Öznitelik rotaları de devralma ile birleştirilebilir. Bu, belirteç değiştirme ile güçlü bir şekilde birleştirilir. Belirteç değiştirme, öznitelik yolları tarafından tanımlanan yol adları için de geçerlidir.
[Route("[controller]/[action]", Name="[controller]_[action]")]her eylem için benzersiz bir yol adı üretir:
[ApiController]
[Route("api/[controller]/[action]", Name = "[controller]_[action]")]
public abstract class MyBase2Controller : ControllerBase
{
}
public class Products11Controller : MyBase2Controller
{
[HttpGet] // /api/products11/list
public IActionResult List()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")] // /api/products11/edit/3
public IActionResult Edit(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Sabit belirteç değiştirme sınırlayıcı veya ile eşleşmesi için karakterini ( veya ) tekrarlayarak kaçış [ ] [[ karakteriyle kaçış karakterine kaçış karakteri. ]]
Belirteç değişimini özelleştirmek için parametre dönüştürücü kullanma
Belirteç değiştirme, parametre dönüştürücü kullanılarak özelleştirilebilir. Parametre dönüştürücü, IOutboundParameterTransformer parametrelerin değerini uygulayan ve dönüştüren bir parametredir. Örneğin, özel parametre dönüştürücü SlugifyParameterTransformer yol değerini SubscriptionManagement olarak subscription-management değiştirir:
public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
public string TransformOutbound(object value)
{
if (value == null) { return null; }
return Regex.Replace(value.ToString(),
"([a-z])([A-Z])",
"$1-$2",
RegexOptions.CultureInvariant,
TimeSpan.FromMilliseconds(100)).ToLowerInvariant();
}
}
, RouteTokenTransformerConvention aşağıdakilere neden olan bir uygulama modeli kuralıdır:
- Bir uygulamanın tüm öznitelik yollarında parametre dönüştürücü uygular.
- Öznitelik yol belirteci değerlerini değiştirildikleri şekilde özeller.
public class SubscriptionManagementController : Controller
{
[HttpGet("[controller]/[action]")]
public IActionResult ListAll()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Yukarıdaki yöntem ListAll ile /subscription-management/list-all eştir.
RouteTokenTransformerConvention, içinde bir seçenek olarak ConfigureServices kaydedilir.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(options =>
{
options.Conventions.Add(new RouteTokenTransformerConvention(
new SlugifyParameterTransformer()));
});
}
Slug tanımı için bkz. Slug üzerinde MDN web belgeleri.
Uyarı
System.Text.RegularExpressionsGüvenilmeyen girişi işlemek için kullanırken bir zaman aşımı geçirin. Kötü niyetli bir Kullanıcı, RegularExpressions hizmet reddi saldırısınaneden olacak giriş sağlayabilir. Zaman aşımını geçen ASP.NET Core Framework API 'Leri RegularExpressions .
Birden çok öznitelik yolu
Öznitelik yönlendirme, aynı eyleme ulaşan birden çok yol tanımlamayı destekler. Bunun en yaygın kullanımı, aşağıdaki örnekte gösterildiği gibi varsayılan geleneksel rotanın davranışını taklit etmektir:
[Route("[controller]")]
public class Products13Controller : Controller
{
[Route("")] // Matches 'Products13'
[Route("Index")] // Matches 'Products13/Index'
public IActionResult Index()
{
return ControllerContext.MyDisplayRouteInfo();
}
Denetleyiciye birden çok yol özniteliği koymak, her birinin eylem yöntemlerinde yol özniteliklerinin her biri ile birleştir olduğu anlamına gelir:
[Route("Store")]
[Route("[controller]")]
public class Products6Controller : Controller
{
[HttpPost("Buy")] // Matches 'Products6/Buy' and 'Store/Buy'
[HttpPost("Checkout")] // Matches 'Products6/Checkout' and 'Store/Checkout'
public IActionResult Buy()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Tüm HTTP fiil yolu kısıtlamaları IActionConstraint uygulanır.
Uygulayan birden çok yol özniteliği IActionConstraint bir eyleme yerleştirilsin mi:
- Her eylem kısıtlaması, denetleyiciye uygulanan yol şablonuyla bir araya geldi.
[Route("api/[controller]")]
public class Products7Controller : ControllerBase
{
[HttpPut("Buy")] // Matches PUT 'api/Products7/Buy'
[HttpPost("Checkout")] // Matches POST 'api/Products7/Checkout'
public IActionResult Buy()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Eylemlerde birden çok yol kullanmak yararlı ve güçlü görünebilir; uygulamanın URL alanı temel ve iyi tanımlanmış şekilde tutmak daha iyidir. Eylemlerde yalnızca gerektiğinde( örneğin, mevcut istemcileri desteklemek için) birden çok yol kullanın.
Öznitelik yolu isteğe bağlı parametrelerini, varsayılan değerleri ve kısıtlamaları belirtme
Öznitelik yolları, isteğe bağlı parametreler, varsayılan değerler ve kısıtlamalar belirtmek için geleneksel yollarla aynı satır içi söz dizimlerini destekler.
public class Products14Controller : Controller
{
[HttpPost("product14/{id:int}")]
public IActionResult ShowProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Yukarıdaki kodda bir [HttpPost("product14/{id:int}")] yol kısıtlaması uygular. Eylem Products14Controller.ShowProduct yalnızca gibi URL yollarla eşdü. /product14/3 Yol şablonu {id:int} bölümü, bu segmenti yalnızca tamsayılarla kısıtlar.
Yol şablonu söz dizimlerinin ayrıntılı açıklaması için bkz. Yol Şablonu Başvurusu.
IRouteTemplateProvider kullanan özel yol öznitelikleri
Tüm yol öznitelikleri IRouteTemplateProvider uygulanır. Çalışma ASP.NET Core çalışma zamanı:
- Uygulama başlatıldığında denetleyici sınıflarında ve eylem yöntemlerinde öznitelikleri okur.
- İlk yol kümesi oluşturmak
IRouteTemplateProvideriçin uygulayan öznitelikleri kullanır.
Özel IRouteTemplateProvider yol özniteliklerini tanımlamak için uygulama. Her IRouteTemplateProvider biri özel bir yol şablonu, sırası ve adı ile tek bir yol tanımlamanızı sağlar:
public class MyApiControllerAttribute : Attribute, IRouteTemplateProvider
{
public string Template => "api/[controller]";
public int? Order => 2;
public string Name { get; set; }
}
[MyApiController]
[ApiController]
public class MyTestApiController : ControllerBase
{
// GET /api/MyTestApi
[HttpGet]
public IActionResult Get()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Yukarıdaki yöntem Get Order = 2, Template = api/MyTestApi döndürür.
Öznitelik yollarını özelleştirmek için uygulama modelini kullanma
Uygulama modeli:
- Başlangıçta oluşturulan bir nesne modelidir.
- Bir uygulamada eylemleri yönlendirmek ve yürütmek ASP.NET Core tarafından kullanılan tüm meta verileri içerir.
Uygulama modeli, yol özniteliklerinden toplanan tüm verileri içerir. Yol özniteliklerinden veriler uygulama tarafından IRouteTemplateProvider sağlanır. Kural -ları:
- Yönlendirmenin nasıl davranacağını özelleştirmek için uygulama modelini değiştirmek üzere yazabilirsiniz.
- Uygulama başlangıcında okunur.
Bu bölümde, uygulama modeli kullanarak yönlendirmeyi özelleştirmenin temel bir örneği yer almaktadır. Aşağıdaki kod, yolları projenin klasör yapısıyla kabaca doğrular.
public class NamespaceRoutingConvention : Attribute, IControllerModelConvention
{
private readonly string _baseNamespace;
public NamespaceRoutingConvention(string baseNamespace)
{
_baseNamespace = baseNamespace;
}
public void Apply(ControllerModel controller)
{
var hasRouteAttributes = controller.Selectors.Any(selector =>
selector.AttributeRouteModel != null);
if (hasRouteAttributes)
{
return;
}
var namespc = controller.ControllerType.Namespace;
if (namespc == null)
return;
var template = new StringBuilder();
template.Append(namespc, _baseNamespace.Length + 1,
namespc.Length - _baseNamespace.Length - 1);
template.Replace('.', '/');
template.Append("/[controller]/[action]/{id?}");
foreach (var selector in controller.Selectors)
{
selector.AttributeRouteModel = new AttributeRouteModel()
{
Template = template.ToString()
};
}
}
}
Aşağıdaki kod, namespace kuralın yönlendirilen öznitelik denetleyicilerine uygulanmasına engel olur:
public void Apply(ControllerModel controller)
{
var hasRouteAttributes = controller.Selectors.Any(selector =>
selector.AttributeRouteModel != null);
if (hasRouteAttributes)
{
return;
}
Örneğin, aşağıdaki denetleyicide NamespaceRoutingConvention kullanmaz:
[Route("[controller]/[action]/{id?}")]
public class ManagersController : Controller
{
// /managers/index
public IActionResult Index()
{
var template = ControllerContext.ActionDescriptor.AttributeRouteInfo?.Template;
return Content($"Index- template:{template}");
}
public IActionResult List(int? id)
{
var path = Request.Path.Value;
return Content($"List- Path:{path}");
}
}
NamespaceRoutingConvention.Applyyöntemi:
- Denetleyici, öznitelik yönlendirildi ise hiçbir şey yapmadı.
- denetleyiciler şablonunu temel alarak ayarlar
namespaceve tabanınamespacekaldırılır.
NamespaceRoutingConvention, içinde Startup.ConfigureServices uygulanabilir:
namespace My.Application
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(options =>
{
options.Conventions.Add(
new NamespaceRoutingConvention(typeof(Startup).Namespace));
});
}
// Remaining code ommitted for brevity.
Örneğin, aşağıdaki denetleyiciyi düşünün:
using Microsoft.AspNetCore.Mvc;
namespace My.Application.Admin.Controllers
{
public class UsersController : Controller
{
// GET /admin/controllers/users/index
public IActionResult Index()
{
var fullname = typeof(UsersController).FullName;
var template =
ControllerContext.ActionDescriptor.AttributeRouteInfo?.Template;
var path = Request.Path.Value;
return Content($"Path: {path} fullname: {fullname} template:{template}");
}
public IActionResult List(int? id)
{
var path = Request.Path.Value;
return Content($"Path: {path} ID:{id}");
}
}
}
Yukarıdaki kodda:
- Temel:
namespaceMy.Application. - Yukarıdaki denetleyicinin tam adı
My.Application.Admin.Controllers.UsersControllerolur. - ,
NamespaceRoutingConventiondenetleyiciler şablonunu olarakAdmin/Controllers/Users/[action]/{id?ayarlar.
, NamespaceRoutingConvention bir denetleyicide öznitelik olarak da uygulanabilir:
[NamespaceRoutingConvention("My.Application")]
public class TestController : Controller
{
// /admin/controllers/test/index
public IActionResult Index()
{
var template = ControllerContext.ActionDescriptor.AttributeRouteInfo?.Template;
var actionname = ControllerContext.ActionDescriptor.ActionName;
return Content($"Action- {actionname} template:{template}");
}
public IActionResult List(int? id)
{
var path = Request.Path.Value;
return Content($"List- Path:{path}");
}
}
Karma yönlendirme: Öznitelik yönlendirme ile geleneksel yönlendirme karşılaştırması
ASP.NET Core uygulamaları geleneksel yönlendirme ve öznitelik yönlendirme kullanımını bir şekilde karıştırabilirsiniz. Tipik olarak tarayıcılar için HTML sayfaları sunan denetleyiciler için geleneksel yollar ve REST API'leri sunan denetleyiciler için öznitelik yönlendirme kullanılır.
Eylemler geleneksel olarak yönlendirilen veya öznitelik yönlendirilen eylemlerdir. Denetleyiciye yol veya eylem yerleştirerek özniteliğini yönlendirin. Öznitelik yollarını tanımlayan eylemlere geleneksel yollar üzerinden (veya tam tersi) ulaşamaz. Denetleyicide herhangi bir yol özniteliği, denetleyici özniteliğinde tüm eylemleri yönlendirilen yapar.
Öznitelik yönlendirme ve geleneksel yönlendirme aynı yönlendirme altyapısını kullanır.
URL Oluşturma ve ortam değerleri
Uygulamalar, eylemlere URL bağlantıları oluşturmak için yönlendirme URL'si oluşturma özelliklerini kullanabilir. URL'ler oluşturmak, sabit kod kodlama URL'lerini ortadan kaldırarak kodu daha sağlam ve bakımı kolay hale getirebilirsiniz. Bu bölüm, MVC tarafından sağlanan URL oluşturma özelliklerine odaklanır ve yalnızca URL oluşturmanın nasıl çalıştığının temellerini içerir. URL oluşturmanın ayrıntılı açıklaması için bkz. Yönlendirme.
Arabirim, IUrlHelper MVC ile URL oluşturma yönlendirmesi arasındaki altyapının temel öğesidir. bir örneği IUrlHelper denetleyiciler, Url görünümler ve görünüm bileşenlerinde özelliği aracılığıyla kullanılabilir.
Aşağıdaki örnekte, arabirimi IUrlHelper özelliği aracılığıyla başka bir Controller.Url eylemin URL'sini oluşturmak için kullanılır.
public class UrlGenerationController : Controller
{
public IActionResult Source()
{
// Generates /UrlGeneration/Destination
var url = Url.Action("Destination");
return ControllerContext.MyDisplayRouteInfo("", $" URL = {url}");
}
public IActionResult Destination()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Uygulama varsayılan geleneksel yolu kullanıyorsa değişkeninin değeri url URL yol /UrlGeneration/Destination dizesidir. Bu URL yolu, aşağıdakiler birleştirerek yönlendirme tarafından oluşturulur:
- Geçerli istekten gelen ve ortam değerleri olarak adlandırılan yol değerleri.
- Geçirilen ve
Url.Actionbu değerleri yol şablonuna alan değerler:
ambient values: { controller = "UrlGeneration", action = "Source" }
values passed to Url.Action: { controller = "UrlGeneration", action = "Destination" }
route template: {controller}/{action}/{id?}
result: /UrlGeneration/Destination
Yol şablonunda her yol parametresinin değerinin yerine değerleri ve ortam değerleriyle eşleşen adlar kullanılır. Değeri olmayan bir yol parametresi şunları olabilir:
- Varsa varsayılan bir değer kullanın.
- İsteğe bağlı ise atlanabilir. Örneğin,
idyol şablonundan{controller}/{action}/{id?}.
Gerekli yol parametresi karşılık gelen bir değere sahip olmazsa URL oluşturma başarısız olur. Bir yol için URL oluşturma başarısız olursa, tüm yollar denenene veya bir eşleşme bulunana kadar sonraki yol denenr.
Yukarıdaki örnek, geleneksel Url.Action yönlendirme varsayıyor. URL oluşturma, öznitelik yönlendirme ile benzer şekilde çalışır,ancak kavramlar farklıdır. Geleneksel yönlendirme ile:
- Yol değerleri bir şablonu genişletmek için kullanılır.
- ve için yol değerleri
controlleractiongenellikle bu şablonda görünür. Bunun nedeni yönlendirme tarafından eşilen URL'lerin bir kurala uymasıdır.
Aşağıdaki örnekte öznitelik yönlendirmesi kullanılır:
public class UrlGenerationAttrController : Controller
{
[HttpGet("custom")]
public IActionResult Source()
{
var url = Url.Action("Destination");
return ControllerContext.MyDisplayRouteInfo("", $" URL = {url}");
}
[HttpGet("custom/url/to/destination")]
public IActionResult Destination()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Yukarıdaki Source kodda yer alan eylem tarafından custom/url/to/destination oluşturulur.
LinkGeneratoralternatif olarak ASP.NET Core 3.0'a IUrlHelper eklendi. LinkGenerator benzer ancak daha esnek işlevsellik sunar. üzerinde her IUrlHelper yönteme karşılık gelen bir yöntem ailesi de LinkGenerator vardır.
Eylem adına göre URL oluşturma
Url.Action, LinkGenerator.GetPathByActionve tüm ilgili aşırı yüklemelerin hepsi bir denetleyici adı ve eylem adı belirterek hedef uç noktayı oluşturmak için tasarlanmıştır.
kullanılırken Url.Action ve için geçerli yol değerleri çalışma zamanı tarafından controller action sağlanır:
- ve değeri hem
controlleractionçevresel değerlerin hem de değerlerin bir parçası. yöntemiUrl.Actionher zaman geçerli ve değerleriniactionkullanır vecontrollergeçerli eyleme yönlendiren bir URL yolu üretir.
Yönlendirme, URL oluşturmada sağlanacak bilgileri doldurmak için çevresel değerlerde değerleri kullanmaya çalışır. Ortam değerleriyle gibi {a}/{b}/{c}/{d} bir yol { a = Alice, b = Bob, c = Carol, d = David } düşünün:
- Yönlendirme, ek değer olmadan BIR URL oluşturmak için yeterli bilgiye sahiptir.
- Tüm yol parametreleri bir değere sahip olduğundan yönlendirme yeterli bilgiye sahip.
Değer { d = Donovan } eklenirse:
- Değer
{ d = David }yoksayılır. - Oluşturulan URL yolu:
Alice/Bob/Carol/Donovan.
Uyarı: URL yolları hiyerarşiktir. Yukarıdaki örnekte, değer { c = Cheryl } ekleniyorsa:
- Değerlerin her ikisi de
{ c = Carol, d = David }yoksayılır. - Artık için bir değer yoktur ve
dURL oluşturma başarısız olur. - URL oluşturmak için
cistenen veddeğerleri belirtilmelidir.
Varsayılan yol ile bu soruna isabet etmek bekliyor {controller}/{action}/{id?} olabilir. Bir ve değerini her zaman açıkça Url.Action belirttiği için bu sorun pratikte controller action nadirdir.
Birçok Url.Action aşırı yüklemesi, ve dışında yol parametreleri için değer sağlamak için bir yol değerleri nesnesi controller action alır. Yol değerleri nesnesi sıklıkla ile id kullanılır. Örneğin, Url.Action("Buy", "Products", new { id = 17 }). Yol değerleri nesnesi:
- Kurala göre genellikle anonim türde bir nesnedir.
- bir veya
IDictionary<>POCO olabilir).
Yol parametreleriyle eşleşmeen ek yol değerleri sorgu dizesine yer alır.
public IActionResult Index()
{
var url = Url.Action("Buy", "Products", new { id = 17, color = "red" });
return Content(url);
}
Yukarıdaki kod tarafından /Products/Buy/17?color=red oluşturulur.
Aşağıdaki kod mutlak bir URL üretir:
public IActionResult Index2()
{
var url = Url.Action("Buy", "Products", new { id = 17 }, protocol: Request.Scheme);
// Returns https://localhost:5001/Products/Buy/17
return Content(url);
}
Mutlak BIR URL oluşturmak için, aşağıdakilerden birini kullanın:
- kabul eden bir aşırı
protocolyükleme. Örneğin, önceki kod. - Varsayılan olarak mutlak URI'ler oluşturan LinkGenerator.GetUriByAction.
Url'leri yönlendirmeye göre oluşturma
Yukarıdaki kod, denetleyiciyi ve eylem adını geçerek BIR URL oluşturma işlemi gösterdi. IUrlHelper ayrıca Url.RouteUrl yöntem ailesini de sağlar. Bu yöntemler Url.Action'abenzer, ancak geçerli ve değerlerini yol action controller değerlerine kopyalamaz. en yaygın Url.RouteUrl kullanımı:
- URL'yi oluşturmak için bir yol adı belirtir.
- Genellikle bir denetleyici veya eylem adı belirtmez.
public class UrlGeneration2Controller : Controller
{
[HttpGet("")]
public IActionResult Source()
{
var url = Url.RouteUrl("Destination_Route");
return ControllerContext.MyDisplayRouteInfo("", $" URL = {url}");
}
[HttpGet("custom/url/to/destination2", Name = "Destination_Route")]
public IActionResult Destination()
{
return ControllerContext.MyDisplayRouteInfo();
}
Aşağıdaki Razor dosya, için bir HTML bağlantısı Destination_Route üretir:
<h1>Test Links</h1>
<ul>
<li><a href="@Url.RouteUrl("Destination_Route")">Test Destination_Route</a></li>
</ul>
HTML'de URL'ler oluşturma ve Razor
IHtmlHelper sırasıyla HtmlHelper ve öğelerini oluşturmak için Html.BeginForm ve Html.ActionLink <form> yöntemlerini <a> sağlar. Bu yöntemler URL oluşturmak için Url.Action yöntemini kullanır ve benzer bağımsız değişkenleri kabul eder. için Url.RouteUrl yardımcıları HtmlHelper ve benzer Html.BeginRouteForm Html.RouteLink işlevlere sahip olandır.
TagHelpers, form TagHelper ve <a> TagHelper aracılığıyla URL'ler üretir. Bunların her ikisi de IUrlHelper uygulamaları için kullanır. Daha fazla bilgi için bkz. Formlarda Etiket Yardımcıları.
Görünümlerin IUrlHelper içinde, yukarıdakiler Url kapsamında olmayan geçici URL oluşturma için özelliği aracılığıyla kullanılabilir.
Eylem Sonuçlarında URL oluşturma
Yukarıdaki örneklerde, bir IUrlHelper denetleyicide kullanımı gösterildi. Denetleyicide en yaygın kullanım, eylem sonucu kapsamında BIR URL oluşturmaktır.
ve ControllerBase temel Controller sınıfları, başka bir eyleme başvurulan eylem sonuçları için kullanışlı yöntemler sağlar. Tipik kullanımlardan biri, kullanıcı girişi kabul edildikten sonra yeniden yönlendirmedir:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(int id, Customer customer)
{
if (ModelState.IsValid)
{
// Update DB with new details.
ViewData["Message"] = $"Successful edit of customer {id}";
return RedirectToAction("Index");
}
return View(customer);
}
Eylem, gibi fabrika yöntemlerinin sonuçlarını RedirectToAction CreatedAtAction verir ve üzerinde yöntemlerine benzer bir desen IUrlHelper kullanır.
Ayrılmış geleneksel yollar için özel durum
Geleneksel yönlendirme, ayrılmış geleneksel yol olarak adlandırılan özel bir yol tanımı kullanabilir. Aşağıdaki örnekte, adlı yol ayrılmış blog bir geleneksel rotadır:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "blog",
pattern: "blog/{*article}",
defaults: new { controller = "Blog", action = "Article" });
endpoints.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Önceki yol tanımlarını Url.Action("Index", "Home") kullanarak, yolu kullanarak URL yolunu / default üretir, ancak neden? Rota değerlerinin kullanarak { controller = Home, action = Index } BIR URL oluşturmak için yeterli olacağını ve blog sonucun olduğunu tahmin edersiniz. /blog?action=Index&controller=Home
Ayrılmış geleneksel yollar, varsayılan değerlerin özel bir davranışını kullanır ve buna karşılık gelen bir yol parametresine sahip değildir ve bu da yolu URL oluşturmada fazla doyumsuz bir şekilde engellemez. Bu durumda varsayılan değerler olur ve { controller = Blog, action = Article } yol parametresi olarak ne de controller action görünür. Yönlendirme URL oluşturma işlemi gerçekleştirecek olduğunda, sağlanan değerlerin varsayılan değerlerle eşleşmesi gerekir. kullanılarak URL blog oluşturma başarısız olur çünkü değerler ile { controller = Home, action = Index } { controller = Blog, action = Article } eşleşmez. Yönlendirme daha sonra başarılı olan default denemesi için geri döner.
Alanlar
Alanlar, ilgili işlevleri ayrı bir grup halinde düzenlemek için kullanılan bir MVC özelliğidir:
- Denetleyici eylemleri için ad alanını yönlendirme.
- Görünümler için klasör yapısı.
Alanları kullanmak, farklı alanlara sahip olduğu sürece bir uygulamanın aynı adla birden çok denetleyiciye sahip olmasına olanak sağlar. Alanları kullanmak, ve 'ye başka bir yol parametresi ekleyerek yönlendirme amacıyla bir area hiyerarşi controller action oluşturur. Bu bölümde yönlendirmenin alanlarla nasıl etkileşim kurduğu ele almaktadır. Alanların görünümlerle nasıl kullanıldıklarına ilişkin ayrıntılar için bkz. Alanlar.
Aşağıdaki örnek, MVC'yi varsayılan geleneksel yolu ve adlandırılmış bir yolu area kullanmak üzere area Blog yapılandırıyor:
app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute("blog_route", "Blog",
"Manage/{controller}/{action}/{id?}");
endpoints.MapControllerRoute("default_route", "{controller}/{action}/{id?}");
});
Yukarıdaki kodda, MapAreaControllerRoute oluşturmak için çağrılır. "blog_route" İkinci parametre olan "Blog" , alan adıdır.
gibi bir URL yolu /Manage/Users/AddUser "blog_route" eşlerken yol, yol değerlerini { area = Blog, controller = Users, action = AddUser } üretir. Yol area değeri için varsayılan bir değer tarafından area üretilen. tarafından oluşturulan yol MapAreaControllerRoute aşağıdakine eşdeğerdir:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute("blog_route", "Manage/{controller}/{action}/{id?}",
defaults: new { area = "Blog" }, constraints: new { area = "Blog" });
endpoints.MapControllerRoute("default_route", "{controller}/{action}/{id?}");
});
MapAreaControllerRoute , sağlanan alan adını (bu durumda) kullanmak için hem varsayılan area değeri hem de kısıtlamayı kullanarak bir yol Blog oluşturur. Varsayılan değer, rotanın her zaman üretmesini { area = Blog, ... } sağlar. Kısıtlama, URL oluşturma { area = Blog, ... } için değer gerektirir.
Geleneksel yönlendirme, sıralamaya bağlıdır. Genel olarak, alanları olan yollar bir alanı olmayan yollara göre daha özel olduğu için daha erken yerleştirilleri gerekir.
Önceki örneği kullanarak, yol değerleri { area = Blog, controller = Users, action = AddUser } aşağıdaki eylemle eş değerlerle eş olur:
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace1
{
[Area("Blog")]
public class UsersController : Controller
{
// GET /manage/users/adduser
public IActionResult AddUser()
{
var area = ControllerContext.ActionDescriptor.RouteValues["area"];
var actionName = ControllerContext.ActionDescriptor.ActionName;
var controllerName = ControllerContext.ActionDescriptor.ControllerName;
return Content($"area name:{area}" +
$" controller:{controllerName} action name: {actionName}");
}
}
}
[Area] özniteliği, bir denetleyiciyi bir alan parçası olarak ifade eder. Bu denetleyici Blog alandadır. Özniteliği olmayan denetleyiciler herhangi bir alana üye değildir ve [Area] yönlendirme tarafından yol area değeri sağlanıyorsa eşleşmez. Aşağıdaki örnekte, yalnızca listelenen ilk denetleyici yol değerleriyle eş { area = Blog, controller = Users, action = AddUser } olabilir.
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace1
{
[Area("Blog")]
public class UsersController : Controller
{
// GET /manage/users/adduser
public IActionResult AddUser()
{
var area = ControllerContext.ActionDescriptor.RouteValues["area"];
var actionName = ControllerContext.ActionDescriptor.ActionName;
var controllerName = ControllerContext.ActionDescriptor.ControllerName;
return Content($"area name:{area}" +
$" controller:{controllerName} action name: {actionName}");
}
}
}
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace2
{
// Matches { area = Zebra, controller = Users, action = AddUser }
[Area("Zebra")]
public class UsersController : Controller
{
// GET /zebra/users/adduser
public IActionResult AddUser()
{
var area = ControllerContext.ActionDescriptor.RouteValues["area"];
var actionName = ControllerContext.ActionDescriptor.ActionName;
var controllerName = ControllerContext.ActionDescriptor.ControllerName;
return Content($"area name:{area}" +
$" controller:{controllerName} action name: {actionName}");
}
}
}
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace3
{
// Matches { area = string.Empty, controller = Users, action = AddUser }
// Matches { area = null, controller = Users, action = AddUser }
// Matches { controller = Users, action = AddUser }
public class UsersController : Controller
{
// GET /users/adduser
public IActionResult AddUser()
{
var area = ControllerContext.ActionDescriptor.RouteValues["area"];
var actionName = ControllerContext.ActionDescriptor.ActionName;
var controllerName = ControllerContext.ActionDescriptor.ControllerName;
return Content($"area name:{area}" +
$" controller:{controllerName} action name: {actionName}");
}
}
}
Her denetleyicinin ad alanı, bütünlük için burada gösterilir. Yukarıdaki denetleyiciler aynı ad alanını kullanırsa bir derleyici hatası oluşturulur. Sınıf ad alanlarının MVC'nin yönlendirmesi üzerinde hiçbir etkisi yoktur.
İlk iki denetleyici alanların üyeleridir ve yalnızca ilgili alan adı yol değeri tarafından area sağlanıyorsa eşler. Üçüncü denetleyici herhangi bir alana üye değil ve yalnızca yönlendirme tarafından için hiçbir değer area sağlanamıyorsa eş olabilir.
Hiçbir değer ile eşleşmeme açısından, değerinin area olmaması, değerinin null veya boş dize area olmasıyla aynıdır.
Bir alan içinde bir eylem yürütilirken, için yol değeri, URL oluşturma için kullanmak üzere area yönlendirme için bir ortam değeri olarak kullanılabilir. Bu, varsayılan olarak alanların URL oluşturma için aşağıdaki örnekte olduğu gibi yapışkan davranacakları anlamına gelir.
app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute(name: "duck_route",
areaName: "Duck",
pattern: "Manage/{controller}/{action}/{id?}");
endpoints.MapControllerRoute(name: "default",
pattern: "Manage/{controller=Home}/{action=Index}/{id?}");
});
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Namespace4
{
[Area("Duck")]
public class UsersController : Controller
{
// GET /Manage/users/GenerateURLInArea
public IActionResult GenerateURLInArea()
{
// Uses the 'ambient' value of area.
var url = Url.Action("Index", "Home");
// Returns /Manage/Home/Index
return Content(url);
}
// GET /Manage/users/GenerateURLOutsideOfArea
public IActionResult GenerateURLOutsideOfArea()
{
// Uses the empty value for area.
var url = Url.Action("Index", "Home", new { area = "" });
// Returns /Manage
return Content(url);
}
}
}
Aşağıdaki kod, url'sini /Zebra/Users/AddUser üretir:
public class HomeController : Controller
{
public IActionResult About()
{
var url = Url.Action("AddUser", "Users", new { Area = "Zebra" });
return Content($"URL: {url}");
}
Eylem tanımı
Denetleyicide NonAction özniteliğine sahip olanlar dışında genel yöntemler eylemlerdir.
Örnek kod
- Mydisplayrouteınfo , Rick.Docs. Samples. routeınfo NuGet paketi tarafından sağlanır ve rota bilgilerini görüntüler.
- Örnek kodu görüntüleme veya indirme ( nasılindir)
Hata ayıklama tanılaması
Ayrıntılı yönlendirme tanılama çıktısı için, Logging:LogLevel:Microsoft olarak ayarlayın Debug . Geliştirme ortamında, appsettings.Development.jsüzerindeki günlük düzeyini ayarlayın:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Debug",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}