MVC 5 Html.BeginForm 包含 URL 中的值

MVC 5 Html.BeginForm include values in URL

在我的表单中,我尝试设置 id = Model.SearchTerm 但它不起作用,因为当我转到表单页面时它说 "Object reference not set to an instance of an object." 这是有道理的,因为用户还没有输入搜索词。

例如,在我们的设施页面上,我们有多种查找设施的方法。在这种情况下,当您按邮政编码搜索时,您会得到 URL 作为 http://localhost:50264/Facilities/SearchByZipCode.

表格如下:

@if (@ViewBag.ZipCodeSerachError != null)
{
    @ViewBag.ZipCodeSerachError
}
@using (Html.BeginForm("SearchByZipCode", "Facilities", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.LabelFor(m => m.SearchTerm, "5 Digit Zip Code:")

    @Html.TextBoxFor(m => m.SearchTerm, new { @class = "form-control", maxlength = 5, id = "zipCodeSearch" })
    <br />
    @Html.LabelFor(m => m.Distance, "List facilities within:")

    @Html.DropDownList("Distance", ViewBag.ZipCodeDistanceList as IEnumerable<SelectListItem>, new { @class = "form-control" })
    <br />
    <button type="submit" class="btn btn-default">Search</button>
}

当您 post 时,您会得到以下 ActionResult:

[HttpPost]
public ActionResult SearchByZipCode(FacilitiesSearchViewModel.FacilitiesByZipCode vm)
{
    var zipCode = oandpService.GetZipCodes().FirstOrDefault(x => x.ZipCodeId == vm.SearchTerm);

    var facilities = new List<Facility>();

    if (zipCode == null)
    {
        ViewBag.ZipCodeSerachError = "An Invalid or Unknown US Zip Code was Entered!";
        facilities = new List<Facility>();
    }
    else
    {
        var zipCodeId = oandpService.GetZipCode(vm.SearchTerm);
        var zipCodes = oandpService.GetZipCodesByDistance(string.Format("{0} {1}", zipCodeId.ZipLongitude, zipCodeId.ZipLatitude), vm.Distance.GetValueOrDefault(0)).Select(x=> new ZipCodeWithDistance() { ZipCode = x.ZipCode, ZipLatitude = x.ZipLatitude, ZipLongitude = x.ZipLongitude, Distance = x.Distance}).ToList();

        facilities = oandpService.GetFacilitiesByZipCodes(zipCodes).OrderByDescending(x=>x.IsFeatured).ThenBy(x=>x.Name).ToList();
    }
    var results = new FacilitiesSearchViewModel.FacilitiesByZipCode
    {
        SearchTerm = vm.SearchTerm,
        Distance = vm.Distance,
        Facilities = facilities
    };

    return View("SearchByZipCode", results);
}

所以,问题是,当有人搜索设施时,我怎样才能做到这一点,它使 URL http://localhost:50264/Facilities/SearchByZipCode?Distance=50&ZipCode=32608

我想完成这项工作,主要是因为我想让我们的 SiteMap 捕获 SearchByZipCode,保留的 RouteParameters 等于 "distance, zipcode"。

感谢您的帮助。如果您需要更多信息,请告诉我。

对于 http://localhost:50264/Facilities/SearchByZipCode?Distance=50&ZipCode=32608,您将需要 HttpGet.

最简单的方法是使用距离和 zipCode 参数创建另一个方法重载。

[HttpGet]
public ActionResult SearchByZipCode(string distance, string zipCode)
{
   ...
}

您的要求 url 类似于基于 HttpGet(类似于查询字符串)

因此您需要在控制器中将您的方法设为 HttpGet。