MVC - 动作传递给错误的控制器

时间:2016-12-19 14:26:15

标签: asp.net-mvc forms razor

我有一个表单,它将SearchByUserViewModel(仅包含string ID)提交给asp-controller="Home" asp-action="SubmitUserSearch"。表单是单个文本框和提交按钮。 SubmitUserSearch从模型中检索ID并返回RedirectToAction("EventListByArtist", m.ID)

Home控制器中的EventListByArtist如下:

    public IActionResult EventListByArtist(string ID)
    {
        var events = context.Events.ToList();
        ViewBag.genres = context.Genres.ToList();
        ViewBag.artists = context.Artists.ToList();
        ViewBag.ID = ID;
        return View("EventList", events);
    }

SubmitUserSearch重定向到EventListByArtist:

    public IActionResult SubmitUserSearch(SearchByUserViewModel m)
    {
        return RedirectToAction("EventListByArtist", m.ID);
    }

SearchByUserViewModel仅包含ID字段。

然而,中间的某些东西中断了,而不是被引导到(例如输入" Bob")Home/EventListByArtist/Bob,我被引导到Bob/EventListByArtist,这不存在。导致此重定向的原因是什么?表格已贴在下面。

<form asp-controller="Home" asp-action="SubmitUserSearch" asp-route-returnurl="@ViewData["ReturnUrl"]" class="form-horizontal">
    <div asp-validation-summary="All" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="ID" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="ID" class="form-control" id="artistInput" />
            <span asp-validation-for="ID" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" class="btn btn-default" value="Search" />
        </div>
    </div>
</form>

项目路由声明(在Startup.cs中)如下:

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

1 个答案:

答案 0 :(得分:1)

SubmitUserSearch() POST方法中,m.ID的值为string(&#34; Bob&#34;),因此您RedirectToAction()会转换为

return RedirectToAction("EventListByArtist", "Bob");

使用this overload,其中第二个参数是控制器的名称,因此它生成/Bob/EventListByArtist

您需要使用this overload,其中第二个参数为object

return RedirectToAction("EventListByArtist", new { id = m.ID });