微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net mvc Anchor Tag Helpers生成的html“id”是查询字符串的一部分,而不是路由数据的一部分

如何解决asp.net mvc Anchor Tag Helpers生成的html“id”是查询字符串的一部分,而不是路由数据的一部分

Startup.cs

public void Configure(IApplicationBuilder app,IWebHostEnvironment env) {
    if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
     } else {
        app.UseExceptionHandler("/Home/Error");
     }
     app.UseStaticFiles();

     app.UseRouting();

     app.UseAuthentication();
     app.UseAuthorization();

     app.UseCookiePolicy(new CookiePolicyOptions {
         MinimumSameSitePolicy = SameSiteMode.Strict,});

     app.UseEndpoints(endpoints => {
         endpoints.MapControllerRoute(
              name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
     });
}

CustomerController.cs

网址:/customer/details/7

[Authorize(Roles = "Admin")]
public async Task<IActionResult> Details(int id) {
    var model = GetUser();
    return View(model);
}

添加以下代码后 (获取当前登录客户的详细信息)

网址:/customer/details

[Route("[controller]/[action]")]
public async Task<IActionResult> Details() {
    int userId = Convert.ToInt32(HttpContext.User.Identity.Name);
    return await Details(userId);
}

Anchor Tag Helpers 生成的 html "id" 是查询字符串的一部分,而不是路由数据的一部分。

<a  asp-action="Details" asp-controller="Customer" asp-route-id="@HttpContextAccessor.HttpContext.User.Identity.Name">User Details</a>

生成这个 HTML:

<a  href="/Customer/Details?id=1">User Details</a>

如何仍然生成 HTML :

<a  href="/Customer/Details/1">User Details</a>

谢谢

解决方法

第 1 点:您的默认路由模板是

     app.UseEndpoints(endpoints => {
         endpoints.MapControllerRoute(
              name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
     });

第 2 点:如果您将路由直接放置到控制器操作中,这将覆盖默认路由,因为您的两个操作具有相同的名称,您还需要向另一个操作添加路由。检查下面的代码,这是。

解决方案 1

[Authorize(Roles = "Admin")]
[Route("[controller]/[action]/{id}")]
public async Task<IActionResult> Details(int id) {
    var model = GetUser();
    return View(model);
}

[Route("[controller]/[action]")]
public async Task<IActionResult> Details() {
    int userId = Convert.ToInt32(HttpContext.User.Identity.Name);
    return await Details(userId);
}

第 3 点:如果您可以更改另一个控制器的操作名称,那么您可以采用这种方法。直接重命名没有路由的动作即可。

解决方案 2

[Authorize(Roles = "Admin")]
public async Task<IActionResult> Details2(int id) {
    var model = GetUser();
    return View(model);
}

[Route("[controller]/[action]")]
public async Task<IActionResult> Details() {
    int userId = Convert.ToInt32(HttpContext.User.Identity.Name);
    return await Details(userId);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。