Я перенес приложение ASP.NET MVC в .NET 6 и заметил, что во время тестирования аргументы метода/контроллера действия используют строку запроса, а не обычный URL-адрес в стиле REST.
Например, если существующее приложение ASP.NET MVC 4 будет использовать следующий стиль URL-адреса
http://webserver/controller/action/123
перенесенное веб-приложение использует
http://webserver/controller/action?id=123
Я создал перенесенное приложение с нуля, используя шаблон для приложения ASP.NET Core 6 MVC.
program.cs
выглядит следующим образом:
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
// doesn't affect the app if it isn't hosted on IIS
builder.WebHost.UseIIS();
builder.WebHost.UseIISIntegration();
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
builder.Services.AddAuthorization(options =>
{
// By default, all incoming requests will be authorized according to the default policy.
options.FallbackPolicy = options.DefaultPolicy;
});
builder.Services
.AddControllers()
.AddMvcOptions(opts =>
{
opts.MaxModelBindingCollectionSize = 10000;
});
builder.Services
.AddRazorPages()
.AddRazorRuntimeCompilation();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});
try
{
Log.Information("Application starting up");
app.Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application startup failed");
}
finally
{
Log.CloseAndFlush();
}
}
Представление Home отображает ссылки на другие контроллеры с помощью помощников Html, таких как
@Html.ActionLink("Vendors", "Index", "VendorController", new { @Id = 15153, @Code = "AGR3" }, null)
и метод действия VendorController
[HttpGet]
public ActionResult Index(int id, string code)
{
// model is a POCO class
var model = _dataService.GetVendorInfo(id, code);
return View("Index", model);
}
Как заставить мое перенесенное приложение ASP.NET Core MVC не использовать строку запроса для передачи аргументов? Нужно ли украшать метод действия каким-то атрибутом маршрутизации? Я думал, что могу полагаться на маршрутизацию на основе соглашений в соответствии с шаблоном маршрута, объявленным в вызове app.UseEndpoint
в методе Main() в Program.cs?
В ядре asp.net вы можете зарегистрировать шаблоны маршрутов mutipule.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "myfirstroute",
pattern: "{controller}/{action}/{id?}/{Code?}");
app.MapControllerRoute(
name: "mysecondroute",
pattern: "{controller}/{action}/{id?}");
Укажите имя партнера маршрута с помощью asp-route
и добавьте необходимые данные маршрута, как показано ниже (если ваш словарь содержит пары ключ-значение, ключ которых не был зарегистрирован как раздел в вашем шаблоне маршрута, он будет добавлен в часть запроса)
@{
var routedatadic = new Dictionary<string,string>();
routedatadic.Add("controller", "Vendor");
routedatadic.Add("action", "Index");
routedatadic.Add("id", "123");
routedatadic.Add("Code", "ABC");
}
<a asp-route = "myfirstroute" asp-all-route-data = "@routedatadic">Vendor1</a>
<a asp-route = "mysecondroute" asp-all-route-data = "@routedatadic">Vendor2</a>
Результат:
Вы можете проверить документ, связанный
Спасибо @RuikaiFeng за такой хороший ответ, похоже, там немного о MVC для ASPNET Core, все статьи и документы, с которыми я сталкивался до сих пор, сосредоточены на страницах Razor, а не на MVC.
Не могли бы вы добавить пример контроллера, который делает?