2017-05-01 5 views
-1

私はMVCとjQueryを初めて使用しています。ASP.NET MVC - ラジオボタンの選択に基づいた追加情報で同じビューを再度表示

私は1つの問題を持っている航空会社の予約プロジェクト開発しています: - オンワードフライト&戻るフライトが同じ日にある場合は、オンワードの間に少なくとも2時間のギャップがあるはず

を到着時間&出発出発時刻。上記のコードは、オンワードラジオボタンのクリックイベントである

$.ajax({type: "GET", url: "/AirlineReservation/Select", data: {arrival: 
$("#arrivalTime").val()}, success: function(data) 
{$("#returnPanel").show();}}); 

- :私は、同じアクションの選択&使用してパラメータとして到着時間を渡すを呼び出しています。次のように

関連するアクションの選択方法のコードスニペットがある: -

List<String> returnTimes = new List<String>(); 
        IQueryable<String> returnTimesQuery = db.Flights.Where(f => f.SectorID == returnSectorID).OrderBy(f => f.DepartureTime).Select(f => f.DepartureTime); 

        foreach (String s in returnTimesQuery) 
        { 
         if (avm.ReturnDate2 == DateTime.Today.ToLongDateString()) 
         { 
          Int32 departHour = Convert.ToInt32(s.Substring(0, 2)); 
          Int32 departMinute = Convert.ToInt32(s.Substring(3, 2)); 

          Int32 bookingHour = DateTime.Now.TimeOfDay.Hours; 
          Int32 bookingMinute = DateTime.Now.TimeOfDay.Minutes; 

          TimeSpan departTime = new TimeSpan(departHour, departMinute, 0); 
          TimeSpan bookingTime = new TimeSpan(bookingHour, bookingMinute, 0); 

          TimeSpan difference = departTime - bookingTime; 

          if (difference.Hours >= 2) 
           returnTimes.Add(s); 
         } 
         else 
          returnTimes.Add(s); 

         if (!String.IsNullOrEmpty(arrival)) 
         { 
          if (avm.ReturnDate.Date == avm.DepartureDate.Date) 
          { 
           avm.ArrivalTime = arrival; 
           Int16 sameDayDepartHour = Convert.ToInt16(s.Substring(0, 2)); 
           Int16 sameDayDepartMinute = Convert.ToInt16(s.Substring(3, 2)); 
           Int16 arrivalHour = Convert.ToInt16(arrival.Substring(0, 2)); 
           Int16 arrivalMinute = Convert.ToInt16(arrival.Substring(3, 2)); 

           TimeSpan sameDayDepartTime = new TimeSpan(sameDayDepartHour, sameDayDepartMinute, 0); 
           TimeSpan arrivalTime = new TimeSpan(arrivalHour, arrivalMinute, 0); 
           TimeSpan sameDayDifference = sameDayDepartTime - arrivalTime; 
           if (sameDayDifference.Hours < 2) 
            returnTimes.Remove(s); 
          } 
         } 
        } 

.......................more code 

最後に私が呼ん: -

return View(avm); 

ところ「AVM」は、すべての必要な情報を保持するビューモデルのインスタンスです。

次のように選択し、表示されるの「returnPanel」-section: -

<div id="returnPanel" class="panel panel-default panel-primary"> 
      @if (Model.ReturnQueryCount) 
      { 
       var returnQueryList = Model.ReturnQuery.ToList(); 

       <div class="panel-heading "> 
        <b>Returning Flight - 
@ViewBag.ReturnSplit[0].ToString() to @ViewBag.ReturnSplit[1].ToString() 
- @Model.ReturnDate2</b> 
       </div> 

       <div class="panel-body"> 
        <table class="table table-bordered table-condensed" 
id="returnTable"> 
         <tr> 
          <th style="text-align: center;">Flight</th> 
          <th style="text-align: center;">Departs</th> 
          <th style="text-align: center;">Arrives</th> 
          <th style="text-align: center;">Economy</th> 
          <th style="text-align: center;">Business</th> 
          <th style="text-align: center;">First 
Class</th> 
         </tr> 
         @for (Int16 i = 0; i < Model.ReturnQuery.Count(); 
i++) 
         { 

          <tr style="text-align: center;"> 
           <td style="vertical-align: 
middle;">@returnQueryList[i].FlightNumber</td> 
           <td style="vertical-align: 
middle;">@returnQueryList[i].DepartureTime</td> 
           <td style="vertical-align: middle;">@returnQueryList[i].ArrivalTime</td> 

        ................more markup and razor code 

私はモデルのReturnQueryプロパティの各フライトのためにテーブルに行を追加しています。

デバッグでは、ReturnQueryプロパティに正しい飛行機が表示されているが、レンダリング中に表示されます。ReturnQueryプロパティにある適切な飛行船の代わりにOnward Flightを選択した後、 。なぜこうなった ?

+0

'Select()'メソッドから返されたビューは決して使用しません。 ajaxの成功のコールバックで行うことは、ページが最初にロードされたときに最初に生成された要素である 'id =" returnPanel "という要素を表示することだけです。その要素を返されたビューに置き換えることをお勧めしますか? –

+0

私はMVCが初めてです。だから私の流れの誤解を許してください。 ajaxの成功コールバックには何があるべきですか? returnPanelは、利用可能なリターンフライトを含むように表示されます。それは最初は表示されず、その代わりに前方飛行が選択された後にのみ表示されます。 –

+0

メインビュー(例えば)に '

'を追加し、コールバックで 'success:function(data){$( '#xxx')。html(データ); } ' –

答えて

1

次のように私は問題を解決した: - :

@if (Model.Return) 
{ 
using (Ajax.BeginForm("Return", null, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "returnDiv" }, new { id = "submitForm" })) 
{ 
    <input type="hidden" name="ArrivalTime" id="arrivalTime" /> 
    @Html.Partial("_OnwardView") 
} 
<div id="returnDiv"></div> 
} 
else 
{ 
@Html.Partial("_OnwardView") 
} 

そして、以降のラジオボタンのクリックイベントハンドラで、私が呼ばれている -

私の選択]ビューでは、私は次のコードを使用していますそれはすぐに応答するためにポストバックを強制する方法を提出する: -

$("#submitForm").submit(); 

は最後に、リターン・アクションでは、私が使用している: -

return PartialView("_ReturnView", avm); 

「avm」は、更新された情報を含むViewModelインスタンスです。

関連する問題