如何重写.net核心中的URL?

问题描述 投票:1回答:2

我想这个机制:

  • 当用户尝试访问localhost / pro / details / alias =>显示此页面但使用小url localhost / alias
  • 当用户尝试直接访问localhost / alias =>显示此页面时使用相同的url localhost / alias
  • 当用户尝试访问* localhost / {controller} / {action} / id =>时,照常显示此页面

我试图修改startup.cs

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

    var rewrite = new RewriteOptions()
        .AddRewrite(@"([a-zA-Z0-9\-]*)", "pro/details/$1", skipRemainingRules: true);

    app.UseRewriter(rewrite);

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

它仅适用于第二颗子弹。

我的代码出了什么问题?以及如何实现我的目标?

c# asp.net .net asp.net-core .net-core
2个回答
1
投票

你能试试this的方法吗?

 var rewrite = new RewriteOptions()
     .AddRewrite(@"(P|p)ro/(D|d)etails/(.*)", "$1", skipRemainingRules: true);

1
投票

为了实现我的目标,我做了以下事情:

首先,我修改我的startup.cs,如:

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

            routes.MapRoute(
                name: "ProfessionnalAlias",
                template: "{id?}",
                defaults: new { controller = "Professionnals", action = "DetailsAlias" });

        });

所以我在默认路线之后创建了一条新路线,以便针对特殊行动:DetailsAlias(见下文)

我还修改了我的ProfessionnalsController,如:

    /// <summary>
    /// This action have an Integer parameter and redirect to action with alias
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var professional = await _context.professional 
            .SingleOrDefaultAsync(m => m.id == id);
        if (professional == null)
        {
            return NotFound();
        }

        RedirectResult redirectResult = new RedirectResult("/"+professional.alias);

        return redirectResult;
    }

    /// <summary>
    /// This action show detail view from alias parameter
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<IActionResult> DetailsAlias(string id)
    {
        if (string.IsNullOrEmpty(id))
        {
            return NotFound();
        }

        var professional= await _context.professional.SingleOrDefaultAsync(m => m.alias == id);
        if (professional== null)
        {
            return NotFound();
        }

        return View("Details", professional);
    }

结论:

  • 如果我试图直接点击/ bob =>显示具有相同网址的“Bob详情页面”
  • 如果我试图点击/ professional / Details / 1 =>使用/ bob Url显示'Bob Detail page'

感谢帮助

© www.soinside.com 2019 - 2024. All rights reserved.