0

在我的 MVC 应用程序中,我返回了一些 Javascript。但是,我在视图上使用了防伪令牌,因此渲染结果将是

<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

如果我理解正确,您需要一个 MVC 操作,它返回 html 和可以通过<script...包含注入页面的脚本标记。您还想通过 MVC 视图呈现它。

您错过的最大问题是,为了将此内容放入调用页面,您需要document.write从脚本执行 - 您不能只发回 HTML 和脚本以响应脚本包含 - 浏览器不会理解它,它只需要javascript。

有几种方法可以做到这一点 - 我已经编写了一整套MVC 控制器方法,具有与将视图结果作为字符串返回到控制器操作ViewContent相同的重载。View然后我可以将它作为字符串文字(对生成 html 电子邮件很有用)传回,也可以传回 javascript 编码器。

在这种情况下,您不需要如此通才。我们可以利用 Darin Dimitrov 对此 SO 的回答:将 MVC 部分视图嵌入到 document.write JS 调用中,并将您的视图拆分为视图和部分视图。视图写document.write()骨架,局部视图渲染你想要注入页面的动态html。不清楚您是在主视图中使用将调用脚本的 Anti Forgery 令牌(在这种情况下,它应该作为它返回的视图的一部分呈现),或者您是否实际上在脚本中对其进行硬编码. 第二个绝对不应该使用,但我写这个答案好像是这样,因为这似乎是你想要的。

一、你的局部视图(姑且称之为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 中添加 [script src] 标签。

于 2012-04-23T22:47:28.067 回答