如何解决asp.net核心mvc
我正在研究Asp.Net Core 3.1 MVC项目,并希望更改url中的某些控制器和动作名称。 几乎所有答案都与.net core API或mvc(无.net core)有关,但我想在Asp.Net Core Mvc应用程序中做到这一点。
例如,控制器:
public class ProductCategoriesController : Controller
{
private readonly DBContext _context;
public async Task<IActionResult> Details(int? id)
{
// Some Codes ...
}
}
我想做的是,当我将动作称为“详细信息”时,URL就像(http:// domain / product-category / power-tools),其中“动力工具”是类别之一,但作为在Asp.Net Core MVC中常见的是(http:// domain / ProductCategories / Details / 1)。
我试图更改控制器前缀名称和操作名称,但是它不起作用。 我还尝试在启动时定义新的路由端点,如下所示,但均无效。
endpoints.MapControllerRoute(
name: "category",pattern: "product-category/{*title}",defaults: new { controller = "ProductCategories",action = "Details" });
是否可以在不使用Api控制器的情况下更改动作名称和控制器名称?我怎么做?谢谢
解决方法
您还必须在模式中添加id
参数,因为您的操作具有可为空的参数。
endpoints.MapControllerRoute(
name: "category",pattern: "product-category/{title}/{id?}",defaults: new { controller = "ProductCategories",action = "Details" });
更新:添加了一个简单的测试屏幕
, Net .Core的样式略有不同,请尝试执行此操作,您可能还需要更新Startup.cs
[Route("/productcategories/")]
public class ProductCategoriesController : Controller
{
private readonly DBContext _context;
[HttpGet("details/{id}")] // here the id is not optional but you can set it to be
public async Task<IActionResult> Details(int id) // id
{
// Some Codes ...
}
}
并添加到Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TodoContext>(opt =>
opt.UseInMemoryDatabase("TodoList"));
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();
});
}
详细了解Asp.Net Core 3.1 MVC约定
,如果需要的话
https://localhost:5001/product-category/power-tools
应该工作,此代码就足够了(经过测试和验证)
public class ProductCategoriesController : Controller
{
[HttpGet("product-category/{id}")]
public async Task<IActionResult> Details(string id)
{
// Some Codes ...
return Ok();
}
}
在Startup#Configure
中 app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
});
如果您需要查找名称和ID:
[Route("product-category")]
public class ProductCategoriesController : Controller
{
[HttpGet("{id}")]
public async Task<IActionResult> Details(string id)
{
// Some Codes ...
return Ok();
}
[HttpGet("{id:int}")]
public async Task<IActionResult> Details(int id)
{
// Some Codes ...
return Ok();
}
}
,
我想要做的最好的解决方案不是依赖于在启动时更改路由。 特别感谢本文https://rehansaeed.com/seo-friendly-urls-asp-net-core/的作者,我这样更改了操作,并完成了操作。
[HttpGet("ProductCategory/{id}/{title}",Name = "ProductsRelatedToCategory")]
public async Task<IActionResult> ProductsRelatedToCategory(int? id,string title)
{
if (id == null || !await _productCategoryRepo.IsExists((int)id))
{
return NotFound();
}
var langId = _languageRepository.GetByCode(LanguageCode).Result.Id;
var productsRelatedToThisCategory = await _productRepo.GetByCategoryId((int)id,langId);
var productCategory = await _productCategoryRepo.GetById((int)id);
var allCategories = await _productCategoryRepo.GetAll(2);
ViewData["ProductCategory"] = productCategory;
ViewData["AllProductCategories"] = allCategories.ToList();
string friendlyTitle = FriendlyUrlHelper.GetFriendlyTitle(productCategory.Title);
if (!string.Equals(friendlyTitle,title,StringComparison.Ordinal))
{
return this.RedirectToRoutePermanent("ProductsRelatedToCategory",new { id = id,title = friendlyTitle });
}
return View("~/Views/Products/ProductsRelatedToCategory.cshtml",productsRelatedToThisCategory.ToList());
}
然后调用该动作:
<a asp-action="ProductsRelatedToCategory" asp-controller="ProductCategories" asp-route-id="14" asp-route-title="Power Tools"><b>Power tools</b></a>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。