2010-11-29 12 views
6

ここで何か奇妙なことが起こっています。なぜ、ASP.NET MVCは、データがIEからではなく、Firefoxからポストされている場合、nullパラメータに苦情を言いますか?

IEの任意のバージョン以外のブラウザでも動作するASP.NET MVC ActionMethodに投稿するJSがあります。次のように問題の コードは次のとおりです。queryDateパラメータにNULLエントリを訴えるだろうIE .NETで

public ActionResult GenerateTargetData(int team, DateTime queryDate, bool forceRegen = false, bool newOutlets = false) 

を実行している場合:

$.ajax({ 
     url: path, 
     type: 'POST', 
     data: { team: team_copy[team_copy.length - 1], queryDate: d.toUTCString(), newOutlets: newOutlets }, 
     success: function (MyResponseObject) { 
      holder.append(MyResponseObject.content); 
      //locate active section and click to show new content - its a mess, but it works 
      //activeMenu.click(); 
      MessageSystem.showMessage("Target Data System", MyResponseObject.message, false); 
      if (team_copy.length > 1) { 
       team_copy.pop(); 
       $('#actualprogress').animate({ width: '+=' + TargetReports.progressratio + '%' }, 'slow'); 
       TargetReports.getTeamData(team_copy, d, newOutlets); 
      } 
      else { 
       MessageSystem.showMessage("Complete", "All Data Fetched", false); 
       $('#show-calendar-selection').fadeIn(); 
       TargetReports.buildTotalsTable("daysandcalls", "daysandcallstotal"); 
       TargetReports.buildTotalsTable("volumeanddistribution", "volumeanddistributiontotal"); 
       TargetReports.buildTotalsTable("outletactivation", "outletactivationtotal"); 
       TargetReports.buildTotalsTable("promotion", "promotiontotal"); 
       //$('#progress').fadeOut().remove(); 
       $('#results-options').fadeIn(); 
       $('#total-holder').fadeIn(); 
       activeMenu.click(); 

       //update link to download file 
       var hidden = $('.hidden-information').first(); 
       var newOutlets = encodeURIComponent($('input[name="newoutlets"]', hidden).val()); 
       var queryDate = encodeURIComponent($('input[name="enddate"]', hidden).val()); 
       var anchor = $('#get-target-reports'); 
       var link = anchor.attr('href'); 

       link = "/manager/TargetResults.csv?endDate=" + queryDate + "&newOutlets=" + newOutlets; 
       anchor.attr('href', link); 
      } 
     } 
    }); 

アクションメソッドのシグネチャは次のようになります。 IEでデバッグツールを使用して、私は次のようにリクエストボディに見えることがわかります。

team=7&queryDate=Mon%2C+29+Nov+2010+23%3A15%3A39+UTC&newOutlets=false 

そして作品のFirefox、中:

team=7&queryDate=Mon%2C+29+Nov+2010+23%3A10%3A46+UTC&newOutlets=false 

で、ここで起こっていただきました!私は本当に見傾けます。すべての助けに感謝!

+0

どのデバッグツールを使用していますか?フィドラー? –

+0

IEの場合、私はIE9(f12) – Sergio

+0

に付属の開発ツールを使用し、またダブルチェックを行うためにフェドラー – Sergio

答えて

7

ASP.net MVCモデルバインダーは、datetimeをISO8601形式で受け入れるため、問題があるようです。

時刻がUTCの場合は、スペースのない時間の直後に「Z」を追加します。 'Z'はゼロUTCオフセットのゾーン指定子です。したがって、「09:30 UTC」は「09:30Z」または「0930Z」と表されます。 「14:45:15 UTC」は「14:45:15Z」または「144515Z」となります。

私はchrome 12.0.733.0 dev、Firefox 4、IE 9.でチェックしました。あなたがjavascript toUTCString()を呼び出すと、別のブラウザが別のものを返します。 ChromeとFirefoxの戻ります "水を、2011年4月20日夜08時31分11秒GMT" だけIEの戻り、 "水、2011年4月20日夜08時31分11秒UTC"

d.toUTCString() .replace( 'UTC'、 'Z')あなたのために動作します。

2

使用

queryDate: d.toISOString() 

代わりの

queryDate: d.toUTCString() 

これは(2012-07-09T15のようなものに:44:03.114Z)ISO規格に準拠した日付をフォーマットし、喜んで受け入れられていますASP.NET MVC

参照:http://www.w3schools.com/jsref/jsref_toisostring.asp

+0

これは、この問題を解決するための推奨方法です。 –

+0

注IE8はtoISOStringをサポートしていません - http://www.w3schools.com/jsref/jsref_toisostring.asp IE7はtoUTCStringをサポートしています。 - http://www.w3resource.com/javascript/object-property-method/date-toUTCString.php –

関連する問題