代码之家  ›  专栏  ›  技术社区  ›  Gustavo Puma

ASP。NET核心MVC:如何将QueryString参数更改为“pretty”URL参数?

  •  0
  • Gustavo Puma  · 技术社区  · 7 年前

    我的问题是美学问题。我有以下控制器:

    [HttpGet("[action]/{EmployeeTypeID:int?}")]
    public IActionResult FilterByType(int EmployeeTypeID = 1)
    { ... }
    

    当我转到以下路线时调用,例如:

    /Employees/FilterByType
    /Employees/FilterByType/2
    

    太棒了控制器将以下ViewModel返回到视图:

    public class EmployeesByTypeViewModel
    {
        public IEnumerable<Employee> FilteredEmployees { get; set; }
        public IEnumerable<SelectListItem> EmployeeTypes { get; set; }
        public int EmployeeTypeID { get; set; }
    }
    

    我的观点是,有一个下拉列表 应该 更改URL参数(以便按不同的EmployeeType进行筛选):

    @model Tiendas.Models.EmployeesByTypeViewModel  
    <h2>Employees</h2>
    <form asp-controller="Employees" asp-action="FilterByType" method="GET">
        <select asp-for="EmployeeTypeID" asp-items="Model.EmployeeTypes">
        </select>
        <button type="submit">Filter</button>
    </form>
    //code displaying filtered employees...
    

    然而,当我在 /Employees/FilterByType 我提交了它产生的表格,例如:

    /Employees/FilterByType?EmployeeTypeID=3
    

    而不是:

    /Employees/FilterByType/3
    

    这正是我想要的(从功能上看,两者都可以)。此外,如果我在上面键入URL,然后提交表单,我会得到以下结果:

    /Employees/FilterByType/3?EmployeeTypeID=1
    

    我怎样才能得到 漂亮的 URL参数而不是查询字符串?我正在使用属性路由。

    1 回复  |  直到 7 年前
        1
  •  1
  •   user3559349 user3559349    7 年前

    您有一个正在生成的表单。浏览器不了解管线定义,根据标准,任何表单控件的值都将添加为查询字符串值。

    如果要生成 /Employees/FilterByType/3 ,则需要javascript/jquery来生成url,并且 location.href 例如,进行重定向

    $('form').submit(function(e) {
        e.preventDefault(); // cancel the default action
        baseUrl = '@Url.Action("FilterByType", "Employees")';
        var selectedEmployee = $('#EmployeeTypeID').val();
        location.href = baseUrl + '/' + selectedEmployee; // redirect
    });