我的表单是不是通过设计提交还是还有其他的东西在这里?

时间:2009-09-22 20:30:58

标签: asp.net-mvc ajax

我在ASP.NET MVC中工作并创建了一个启用AJAX的简单表单(使用MicrosoftAjaxMicrosoftMvcAjax)。它只是将表单值传递给局部视图,然后使用新值更新目标元素。

以下是表格的视图:

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        <%=Html.Encode(ViewData["Message"]) ?? "Home Page"%></h2>
    <div>
        <p>
            <% using (Ajax.BeginForm("AjaxView", new AjaxOptions { UpdateTargetId = "Test" })) { %>
            <%= Html.Label("FormMessage","Message") %>
            <%= Html.TextBox("FormMessage")%>
            <br />
            <%= Html.Submit("Submit","Go") %>
            <% } %>
        </p>
        <p id="Test">
            <% Html.RenderPartial("AjaxView"); %>
        </p>
    </div>
</asp:Content>

这是来自控制器的代码:

public ActionResult AjaxView()
{
    if(Request.IsAjaxRequest())
    {
        ViewData["AjaxMessage"] = string.IsNullOrEmpty(Request.Form["FormMessage"]) ? "No Form Data!" : Request.Form["FormMessage"];
        return PartialView("AjaxView");
    }
    return View();
}

这是局部视图:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<%= ViewData["AjaxMessage"] ?? "Default Text" %>

似乎一切正常,但当我尝试输入<>的内容时,脚本不会执行。我不打算让人们能够在这个字段中输入html,但是为什么脚本无法执行?

如果脚本被这些字符混淆是一个问题,我可以在ajax运行之前编码传入的文本(使用Server.HtmlEncode()或类似的东西),以便转换任何“不安全”的字符和脚本会继续正常吗?

谢谢!

修改

我刚才意识到如果我输入“&lt;&lt;”,我会得到“&lt;”从脚本回来。也许这些信息会有所帮助。

1 个答案:

答案 0 :(得分:1)

使用Firebug的标签或Fiddler查看服务器的响应。它可能会告诉你问题是什么。只要AJAX请求没有按预期运行,您就应该这样做。对于非AJAX请求,问题通常是显而易见的,因为你看到一个黄色的死亡屏幕或类似的东西。有了AJAX请求,如果不是调用JavaScript所期望的那样,你必须深入挖掘才能看到响应。

很有可能ASP.NET的反XSS功能阻止任何使用尖括号作为潜在HTML的东西。如果这是问题,您将有几个选择。您可以简单地禁止请求中的尖括号(并且可能会编写一些JavaScript以向用户显示更好的消息),或者您可以使用JavaScript对它们进行编码。 Server.HtmlEncode对您没有帮助,因为您需要在JavaScript代码中执行此操作,而不是C#代码。最后,您可以使用操作上的ValidateRequest(false)属性关闭反XSS功能,使用类似CodePlex上的反XSS库进行自己的反XSS处理。