0

私のMVCアプリでは、Javascriptを返しています。Howveer、私はビューで偽造防止トークンを使用しているので、レンダリングされた結果は次のようになります

<input name="__RequestVerificationToken" type="hidden" value="E8as+4Ff1u/c/+kuFcNXXCREB5pz5GAfH2krN5RvzURJaHZSApuRc4czZqmoITaKdy0XhN5sFfRzl4ne+wB3PkWOscBWzoIxUk3hGaFwDxRXSbMs8K9IwojEAtV5u57MR7hiSujr6MOTpjjbf5FPaYgO4gmH6lSR9mbSyO2IedI=" />

<script type="text/javascript">
   // Here, we ensure that jQuery is loaded then load up the rest of our JS in in order.
   ord = Math.random() * 10000000000000000;
   ...

したがって、ページに追加するHTMLがあり、次にJSがあります。

問題は、Chromeで次の通知を受け取ることです。

スクリプトとして解釈されたが、MIMEタイプで転送されたリソース

偽造防止トークンを利用するには、ブラウザでこれをHTMLとして解釈する必要があります。

私はこれをビューに入れてみました:

<%@Page Title="" Language="C#" ContentType="text/xml" %>

レンダリングするもの:

<%System.Web.WebPages.DynamicPageDataDictionary`1[System.Object] Title="" Language="C#" ContentType="text/xml" %>

<input name="__RequestVerificationToken" type="hidden" 
...

...しかし、同じメッセージが続きます。

私のコントローラーでは、次のことも試しました。

        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        Byte[] bytes = encoding.GetBytes(page.clientScript);

        return new ContentResult
        {
            ContentType = "text/xml", // also tried text/html
            Content = Encoding.UTF8.GetString(bytes),
            ContentEncoding = System.Text.Encoding.UTF8
        }; 

同じ問題。

- アップデート -

これは、テキストを返すためにMVCアプリを呼び出す方法です。

  // used to load scripts on to the client script using a non-blocking asynch request
  (function() {
  function async_load(){
  var s = document.createElement('script');
  s.type = 'text/javascript';
  s.async = true;
  s.src = 'http://myserver/MyAppPath/someids';
  var x = document.getElementsByTagName('script')[0];
  x.parentNode.insertBefore(s, x);
  }
  if (window.attachEvent)
  window.attachEvent('onload', async_load);
  else
  window.addEventListener('load', async_load, false);
  })();
4

2 に答える 2

0

私が正しく理解している場合は、HTMLと、<script...インクルードを介してページに挿入できるスクリプトタグの両方を返すMVCアクションが必要です。また、MVCビューを介してこれをレンダリングする必要があります。

あなたが見逃した最大の問題は、このコンテンツを呼び出しページに取り込むためにdocument.write、スクリプトから実行する必要があるということです-スクリプトインクルードに応答してHTMLとスクリプトを送り返すことはできません-ブラウザはしませんそれを理解してください、それはjavascriptだけを期待しています。

これを行うにはいくつかの方法があります-ビューの結果を文字列としてコントローラーアクションに返すのViewContentと同じオーバーロードを使用して、MVCコントローラーメソッドの完全なスイートを作成しました。View次に、それを文字列リテラル(htmlメールの生成に便利)として返すだけでなく、javascriptエンコーダーにも渡すことができます。

この場合、あなたはそれほどジェネラリストである必要はありません。このSOに対するDarinDimitrovの回答を活用できます。MVCパーシャルビューをdocument.writeJS呼び出しに埋め込み、ビューをビューとパーシャルに分割します。ビューはスケルトンを書き込み、document.write()部分ビューはページに挿入するダイナミックHTMLをレンダリングします。スクリプトを呼び出すメインビューで偽造防止トークンを使用しているのか(この場合、スクリプトが返すビューの一部としてレンダリングする必要があります)、実際にスクリプトにハードコーディングしているのかは不明です。 。2番目は絶対に使用すべきではありませんが、それがあなたが望むものであるように見えるので、私はそれがそうであるかのようにこの答えを書いています。

まず、あなたの部分的なビュー(それを呼びましょう、それFragment.cshtmlを入れます~/Views/Shared

<input name="__RequestVerificationToken" 
type="hidden"value="[ommitted]" /> 

<script type="text/javascript"> 
// Here, we ensure that jQuery is loaded then load up the rest of our JS in in order. 
ord = Math.random() * 10000000000000000; 
...

次に、ホストビューと呼ばれますSomeIds.cshtml

 @{ Response.ContentType = "text/javascript"; }
 document.write('@Html.Raw(HttpUtility.JavaScriptStringEncode(Html.Partial("~/Views/Shared/Fragment").ToHtmlString()))') 

このビューは、document.writeによって返されたHTMLをFragment.cshtmlスクリプトを含むページに挿入する呼び出しを返します。

于 2012-04-23T22:45:38.473 に答える
0

すべてのマークアップがレンダリングされたPartialViewを返しますか?

(フォームとスクリプトを含む)とコントローラーでPartialViewを作成します。

    public ActionResult Index(Models.MyModel model) 
    {
        // validate the model if needed
        return PartialView("[My PartialView Name]", model);
    }

スクリプトを別々のファイルに入れて、PartialViewに[scriptsrc]タグを追加することができます。

于 2012-04-23T22:47:28.067 に答える