1

在我的索引视图中,我需要允许用户输入搜索条件。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);
    }

编辑

按照下面的说明,我创建了我的视图模型,如下所示:

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>

然而,所有的TextBoxForTextAreaFor助手都说不存在任何指定的属性。

@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
4

2 回答 2

4

好的,所以你要做的第一件事就是创建一个模型,它只是一个看起来像这样的新类文件。

 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>
}
于 2013-10-02T16:18:07.797 回答
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" />
}
于 2013-10-02T16:29:51.417 回答