1

インデックス ビューで、ユーザーが検索条件を入力できるようにする必要があります。FormCollectionこの基準は、オブジェクトの形式でインデックス コントローラに送り返されます。次に、検索条件を抽出し、要求された情報をデータベースから取得して、ユーザーを Index ビューに戻します。ただし、ユーザーが要求された情報を含むインデックス ビューに戻ると、FormCollectionオブジェクトのデータは空白になります。

使用する 3 つのテキスト ボックスにユーザーの検索条件を保持できるようにしたいのですが、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>

ただし、すべてのヘルパー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 オブジェクトを探していたことを見逃していました。ヘッダーをこれに変更し、問題を修正しました。

@model Monet.ViewModel.ZipCodeIndex
4

2 に答える 2