Asp.Net MVC控制器不断向URL添加值

时间:2019-03-07 14:57:34

标签: asp.net post model-view-controller get

我正在尝试使索引视图中的表被某些值过滤,为此,我使用了[HttpGet] Index方法,该方法创建了2个selectLists(每种过滤器类型一个)。筛选器按钮应该采用每个列表的选定值,并将它们发送到[HttpPost] Index方法,该方法将筛选表。
问题在于,它在我过滤时不会“重置” URL,因此每次我更改过滤器时,它都会不断添加到URL中。

索引获取(此方法很好)

        [HttpGet]
        public IActionResult Index()
        {
            IEnumerable<Lesson> Lessons = _LessonRepository.GetAll();
            ViewData["Types"] = GetTypesAsSelectList();
            ViewData["Difficulties"] = GetDifficultiesAsSelectList();
            return View(Lessons);
        }

索引发布(每次我单击视图中的过滤器按钮时,此列表都会不断添加/ Lesson / Index)

       [HttpPost]
        public IActionResult Index(string filter, string filter2)
        {
            IEnumerable<Les> Lessons = null;
            if (filter == null && filter2 == null)
                Lessons = _LessonRepository.GetAll();
            else if (filter != null && filter2 == null)
            {
                Lessons = _LessonRepository.GetByDifficulty(filter);
            }
            else if (filter == null && filter2 != null)
            {
                Lessons = _LessonRepository.GetByType(filter2);
            }
            else if (filter != null && filter2 != null)
            {
                Lessons = _LessonRepository.GetByType(filter2).Where(l => l.Difficulty == filter);
            }
            ViewData["Types"] = GetTypesAsSelectList();
            ViewData["Difficulties"] = GetDifficultiesAsSelectList();
            return View(Lessons);
        }

查看

<form action="Lesson/Index/" method="post">
    <div class="form-inline">
        <select id="difficulties" name="filter" asp-items="@ViewData["Difficulties"] as List<SelectListItem>" class="form-control">
            <option value="">-- Select difficulty --</option>
        </select>

        <select id="types" name="filter2" asp-items="@(ViewData["Types"] as List<SelectListItem>)" class="form-control">
            <option value="">-- Select type --</option>
        </select>
        <button type="submit">Filter</button>
    </div>
</form>

1 个答案:

答案 0 :(得分:0)

发生这种情况是因为action标记中的form属性包含相对URL。请求的结果URL为current url + relative url,这就是为什么Lesson/Index/根据请求附加到当前URL的原因。考虑通过在开头添加/来使用绝对URL

<form action="/Lesson/Index/" method="post">

由于使用的是ASP.NET Core,因此也可以使用asp-actionasp-controller

<form asp-action="Index" asp-controller="Lesson" method="post">

或者您可以坚持使用相对URL,但是您需要考虑如何构建最终的URL。因此,如果您的表单位于/Lesson/Index视图上,则可以使用以下操作

<!-- empty action, or you can just remove the attribute completely -->
<form action="" method="post"> 

这会给您current url + relative url = "/Lesson/Index" + "" = "/Lesson/Index"