0

在 ASP.NET MVC 中,我有一个发布到操作的主要标准表单,并在同一视图中呈现响应。

问题是响应类型返回为 application/x-javascript,因此浏览器将 HTML 呈现为文本。

我已将问题缩小到由在母版页中包含一些部分视图引起的,这些部分视图呈现回发到返回JavaScriptResult的操作的表单。

当我删除这些部分视图引用时,主表单发布响应的响应类型是我想要的 text/html。

为什么 JavaScriptResult 操作会干扰主表单发布。我没有发布此操作,那么为什么 MVC 会决定推断响应内容类型应该是 application/x-javascript?

基本主表格:

@using (Html.BeginForm("TestSearch", "TestSearch", FormMethod.Post))
{
    ....
}

[HttpPost]
public ActionResult TestSearch(TestSearchInfo testSearchInfo)
{
    ...

    return View(testSearchInfo);
}

在布局页面中:

@{Html.RenderPartial("~/Views/Account/LoginOrRegister.cshtml");}

Which is a form that posts to...

[HttpPost]
public JavaScriptResult Login(LoginInfo loginInfo)
{
}

更新:

核心问题似乎是,当我点击主表单的提交按钮时,另一个启用了 MVC ajax 的表单也在回发,因此,两个动作都在触发,返回 JavaScriptResult 的那个是正在第二次开火。我仍然不确定如何防止这种行为......

更新:

请看下面的答案

4

2 回答 2

0

我想你应该避免 HTML 表单嵌套来摆脱这个问题。这在语义上也不正确。

这在 ASP.NET WebForms 时代是一个问题,但使用 ASP.NET MVC 应该会容易得多。

于 2012-05-22T09:23:53.613 回答
0

在这里回答,希望对其他人有所帮助。

我已经修改了所有涉及 JavaScript 响应的表单,以便呈现控件的操作,传统上是具有 HttpGet 属性的操作以删除 HttpGet,因此该操作可以在 GET 和 POST 上下文中触发。

这需要重命名表单发布到的操作,因此对于应该触发哪个方法没有歧义。

我想这是有道理的——我想我希望看到的是渲染包含的表单不是 POST 目标的部分视图应该使用 get 重载来渲染。我明白为什么这不是它的工作方式。

// No GET / POST Attribute, this can no fire in both GET and POST contexts
public ActionResult Login()
{
    .. This will now fire for every page load, where as before the HttpGet
       filter only allowed to run in a GET context. 
}

[HttpPost]
public JavaScriptResult DoLogin(LoginInfo loginInfo)
{
}
于 2012-05-22T10:23:48.350 回答