MVC 5 - 路由问题

MVC 5 - Routing Issue

我在调用我的控制器方法时遇到问题,但没有将所需的参数值传递给它:有什么地方出错了吗? (目前 "query" 参数为空)。

控制器操作

public ActionResult Search(string query, int page = 1)
{
    if (!string.IsNullOrWhiteSpace(query)) return SearchResults(query, page);
    return View(new ApplicationSearchViewModel());
}

查看 HTML

@model BluBrik.Mobile.WebUI.Models.ApplicationSearchViewModel

@{
    ViewBag.Title = "Find Application";
}

<h2>Search</h2>

@using (Html.BeginForm("SearchResults", "Application", new { query = Model.SearchString }))
{
    <div>
        @Html.EditorFor(m => m.SearchString)
        <input type="submit" value="Search" />
    </div>
}

Route.config

    routes.MapRoute(
        name: null,
        url: "Application/Search/{query}",
        defaults: new { controller = "Application", action = "Search", query = UrlParameter.Optional }
    );

表单元素的 HTML 将在加载页面时创建,而不是在 post 返回时创建。因此,查询字符串中的 Model.SearchString 值不会反映 posted 形式中的值。

您需要使用 post 数据。您可能还想考虑两个控制器操作,用于 GET 和 POST。这会给你:

控制器

[HttpGet]
public ActionResult Search(string query, int page = 1)
{
    if (!string.IsNullOrWhiteSpace(query)) return SearchResults(query, page);
    return View(new ApplicationSearchViewModel());
}

[HttpPost]
public ActionResult Search(ApplicationSearchViewModel model)
{
    if (!string.IsNullOrWhiteSpace(model.SearchString)) return SearchResults(model.SearchString , 1);
    return View(new ApplicationSearchViewModel());
}

查看

@using (Html.BeginForm("Search", "Application", FormMethod.Post))
{
    <div>
        @Html.EditorFor(m => m.SearchString)
        <input type="submit" value="Search" />
    </div>
}