2017-10-27 2 views
0

[OK]をすべての奇妙な1ここに....私は4日前と今日の日付を含むドロップダウンリストでビューを持っているViewbag連銀DropdownFor - アクション一度選択削除しプロパティは、Paramのを持っている

...

インデックス(アクション)は、DateTimeのnullで取得されます。DropDownListは、現在の日付が選択された状態で表示されます。

HTML SOURCE URL \コントローラ\指数

<select class="form-control" id="Date" name="Date" onchange="Change_Date(this)" 
    <option value="23/10/2017">23/10/2017</option> 
    <option value="24/10/2017">24/10/2017</option> 
    <option value="25/10/2017">25/10/2017</option> 
    <option value="26/10/2017">26/10/2017</option> 
    <option selected="selected" value="27/10/2017">27/10/2017</option> 
    </select> 

指数(アクション)が、それはまったく同じプロセスを経て、私は物理的に選択された= Trueのプロパティを見ることができるにもかかわらず、日時で起動されViewBag.DateListの...ドロップダウンには選択されたオプションがなく、最初のオプションに戻ります。

HTML SOURCE URL \コントローラ\指数?日付= 2017年10月26日

<select class="form-control" id="Date" name="Date" onchange="Change_Date(this)" 
    <option value="23/10/2017">23/10/2017</option> 
    <option value="24/10/2017">24/10/2017</option> 
    <option value="25/10/2017">25/10/2017</option> 
    <option value="26/10/2017">26/10/2017</option> 
    <option value="27/10/2017">27/10/2017</option> 
    </select> 

私はJSをバイパスし、URLに直接日時を入れてみましたが、運のないようにしています。 ..

た?日付= URLで 日付は、オプションの要素から選択されたプロパティを削除する理由を私は理解できない

...

ただ、両方の私で明確にしますViewBag.DateList内にSelected = Trueプロパティが存在しますが、パラメータがアクションに渡されたときには期待どおりに表示されません。あなたのURLで

ビュー

@Html.DropDownList("Date", (IEnumerable<SelectListItem>)ViewBag.DateList, 
    new { @class = "form-control", @onchange="Change_Date(this)" }) 

方法

public ActionResult Index(DateTime? date) 
    { 
     if (date.HasValue == false) 
     { 
      date = DateTime.Now.Date; 
     } 
     List<SelectListItem> Dates = new List<SelectListItem>(); 
     for (int i = -4; i < 1; i++) 
     { 
      string date_display = DateTime.Now.Date.AddDays(i).ToShortDateString(); 
      Dates.Add(new SelectListItem { Text = date_display, Value =date_display}); 
     } 

     foreach (SelectListItem item in Dates) 
     { 
      if (item.Value == date.ToShortDateString()) 
       item.Selected = true; 
     } 
     ViewBag.DateList = Dates; 
    } 

JS

function Change_Date(val) 
{ 
    var value = $('#Date').val(); 
    value = value.split("/").reverse().join("-"); 
    var url = "/Controller/Index?date=" + value; 
    window.location.href = url; 
} 

答えて

1

?date=date追加あなたのメソッドにdateという名前のパラメータがあるので、dateからModelStateの値。フォームコントロールを生成するHtmlHelperメソッドは、存在する場合はModelStateの値を使用します(次にViewDataから実際のモデルプロパティから)。動作の説明については、this answerの2番目の部分を参照してください。

内部DropDownList()(およびDropDownListFor())メソッドは、新しいIEnumerable<SelectListItem>を構築し、そのないnull場合、あなたは(Dateあなたの場合)への結合性に基づいてSelectedプロパティの値を設定します。

../Controller/Index?date=2017-10-26を使用してリダイレクトすると、dateパラメータの値(およびModelStateの値)は26/10/2017 12:00:00 AMになります。DropDownList()方法はViewBag.DateListをループすることによって、そのIEnumerable<SelectListItem>を構築するとき、それはModelStatedateの値を使用してSelectListItem値の.ToString()プロパティを比較し、いずれかの一致を見つけることができませんので、何もオプションとして設定されていません(文字列"26/10/2017 12:00:00 AM""26/10/2017"に等しいではありません)選択された。正しいオプションを選択したのは

一部のオプションは、ビューを返す 前に、コントローラのメソッドでModelState.Clear()を追加

  1. が含まれます。
  2. の上に非常に明確な説明のために、たとえば、 @Html.DropDownList("SelectedDate", ...)
+0

非常に素晴らしい...感謝のメソッドのパラメータの名前、またはそれらが一致していないので、ドロップダウンリストで名前 のいずれかを変更します答え。 ModelStateがURLから取得したことはわかりませんでした –

関連する問題