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。
在我的表单中,我尝试设置 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。