在我的索引视图中,我需要允许用户输入搜索条件。此条件以FormCollection
对象的形式发送回索引控制器。然后,我提取搜索条件,从数据库中提取所请求的信息,然后将用户发送回“索引”视图。但是,一旦用户返回带有请求信息的索引视图,FormCollection
对象中的数据现在为空。
我希望能够在我使用的三个文本框中保留用户的搜索条件,但是我不确定如何使用FormCollection
。有谁知道如何做这个或另一个我应该使用?
查看
@using(Html.BeginForm())
{
<div id="searchBox" class="boxMe">
<div id="zipBox" style="float: left; padding-left: 20px; padding-right: 10px; padding-top: 20px; padding-bottom: 20px; vertical-align: top;">
@Html.Raw("Zip Code")
@Html.TextArea("ZipSearch", new { style = "width: 300px;", placeholder = "Enter up to 35 comma separated zip codes" })
</div>
<div id="dateBox" style="float: left; padding-right: 10px; padding-top: 20px;">
@Html.Raw("Effective on this date")
@Html.TextBox("DateSearch", null, new { style="width: 80px;"})
</div>
<div id="stateBox" style="float: left; padding-right: 20px; padding-top: 20px;">
@Html.Raw("State")
@Html.TextBox("StateSearch", null, new { style = "width: 25px;" })
<button type="submit">Search</button>
</div>
</div>
<div style="clear: both;"></div>
}
控制器
public ViewResult Index(FormCollection searchDetails = null)
{
string zip = searchDetails["ZipSearch"];
string date = searchDetails["DateSearch"];
string state = searchDetails["StateSearch"];
if (String.IsNullOrWhiteSpace(zip) && String.IsNullOrWhiteSpace(date) && String.IsNullOrWhiteSpace(state))
{
return View();
}
string[] zipArray;
DateTime effectiveDate;
//Convert date string to DateTime type
if (String.IsNullOrWhiteSpace(date))
{
effectiveDate = DateTime.MinValue;
}
else
{
effectiveDate = Convert.ToDateTime(date);
}
//Conduct search based on Zip Codes
if (!String.IsNullOrWhiteSpace(zip))
{
//Create array and remove white spaces
zipArray = zip.Split(',').Distinct().ToArray();
for (int i = 0; i < zipArray.Length; i++)
{
zipArray[i] = zipArray[i].Trim();
}
//Add zip codes to list object then send back to view
List<ZipCodeTerritory> zips = new List<ZipCodeTerritory>();
if (String.IsNullOrWhiteSpace(state))
{
foreach (var items in zipArray)
{
var item = from z in db.ZipCodeTerritory
where z.ZipCode.Equals(items) &&
z.EffectiveDate >= effectiveDate
select z;
zips.AddRange(item);
}
}
else
{
foreach (var items in zipArray)
{
var item = from z in db.ZipCodeTerritory
where z.ZipCode.Equals(items) &&
z.EffectiveDate >= effectiveDate
select z;
zips.AddRange(item);
}
}
return View(zips);
}
//Zip code was not specified so search by state
if (!String.IsNullOrWhiteSpace(state))
{
var items = from z in db.ZipCodeTerritory
where z.StateCode.Equals(state) &&
z.EffectiveDate >= effectiveDate
select z;
return View(items);
}
//Neither zip code or state specified, simply search by date
var dateOnly = from z in db.ZipCodeTerritory
where z.EffectiveDate >= effectiveDate
select z;
return View(dateOnly);
}
修改
按照以下说明,我创建了我的View模型:
public class ZipCodeIndex
{
public List<ZipCodeTerritory> zipCodeTerritory { get; set; }
public string searchZip { get; set; }
public string searchDate { get; set; }
public string searchState { get; set; }
}
但是在我的视图中,我无法访问任何这些属性。视图的标题如下所示:
@model IEnumerable<Monet.ViewModel.ZipCodeIndex>
但是,所有TextBoxFor
和TextAreaFor
帮助程序都表示不存在任何指定的属性。
@using(Html.BeginForm("Index", "ZipCodeTerritory", FormMethod.Post))
{
<div id="searchBox" class="boxMe">
<div id="zipBox" style="float: left; padding-left: 20px; padding-right: 10px; padding-top: 20px; padding-bottom: 20px; vertical-align: top;">
@Html.Raw("Zip Code")
@Html.TextAreaFor(model => model.searchZip, new { style = "width: 300px;", placeholder = "Enter up to 35 comma separated zip codes" })
</div>
<div id="dateBox" style="float: left; padding-right: 10px; padding-top: 20px;">
@Html.Raw("Effective on this date")
@Html.TextBoxFor(model => model.searchDate, null, new { style="width: 80px;"})
</div>
<div id="stateBox" style="float: left; padding-right: 20px; padding-top: 20px;">
@Html.Raw("State")
@Html.TextBoxFor(model => model.searchState, null, new { style = "width: 25px;" })
<button type="submit">Search</button>
</div>
</div>
<div style="clear: both;"></div>
}
最终编辑
错过了该网页正在寻找IEnuerable
模型对象。将标题更改为此并修复了问题。
@model Monet.ViewModel.ZipCodeIndex
答案 0 :(得分:3)
好的,所以你要做的第一件事是创建一个模型,只是一个看起来像这样的新类文件。
public class AddressModel
{
public int zip{ get; set; }
public string state{ get; set; }
public string date{ get; set; }
}
然后另一个新的类文件称为视图模型。这样你可以参考不同的东西。喜欢您的搜索地址,然后将结果以单独的列表返回。
public class AddressViewModel
{
public AddressModel SearchAddress { get; set; }
public List<AddressModel> ResultsAddress{ get; set; }
}
然后在您的视图中引用视图模型,如@model MVCTestProject.ViewModels.InsertPage
在顶线。
然后这些将是你的文本框。
@using (Html.BeginForm("Submit", "Insert", FormMethod.Post))
{
@Html.TextBoxFor(model => model.SearchAddress.zip)
@Html.TextBoxFor(model => model.SearchAddress.state)
@Html.TextBoxFor(model => model.SearchAddress.date)
<input id="button" name="button" type="submit" value="submit" />
}
在您的控制器中它将与此类似。
public ActionResult Submit(AddressViewModel model)
{
model.ResultsAddress = (from z in db.ZipCodeTerritory
where z.StateCode.Equals(state) &&
z.EffectiveDate >= model.SearchAddress.date
select new AddressModel {
date = z.effectiveDate }).toList();
return View("viewName", model);
}
这将返回您原始的搜索条件和结果。可能不是百分之百的功能,但主要的想法是存在的,如果你决定走这条路,我可以帮你解决问题。
显示结果
@for (int i = 0; i < Model.ResultsAddress.Count; i++)
{
@Html.DisplayFor(model => model.ResultsAddress[i].date)
}
或仅显示它们的顶部可以用于编辑和重新提交数据。
@foreach (var item in Model.ResultsAddress)
{
<div>@item.date</div>
}
答案 1 :(得分:0)
Ryan Schlueter是对的,您应该使用ASP.NET MVC原则,例如模型,自动绑定到动作参数中的模型字段等等。但在这种情况下,你应该使用强类型视图:
动作:
public ActionResult SomeAction(ModelClass model)
{
....
return("ViewName", model)
}
查看:
@model SomeNamespace.ModelClass
@using (Html.BeginForm("Submit", "Insert", FormMethod.Post))
{
@Html.TextBoxFor(model => model.Property1)
@Html.TextBoxFor(model => model.Property2)
@Html.TextBoxFor(model => model.Property3)
<input id="button" name="button" type="submit" value="submit" />
}