在ASP.NET MVC中,我有一个主要的标准表单,它发布到一个操作,并在相同的视图中呈现响应。
问题是响应类型返回为application/,因此浏览器将HTML呈现为文本。
我已经缩小了问题的范围,因为母版页中包含了一些部分视图,这些视图将表单呈现回返回JavaScriptResult.的操作。
当我删除这些部分视图引用时,主表单post响应的响应类型是text/html。
为什么JavaScriptResult操作会干扰主表单post。我没有发布到这个操作,所以为什么MVC决定推断响应内容类型应该是application/?
基本主要形式:
@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)
{
}
更新:
核心问题似乎是,当我单击主表单的submit按钮时,启用了MVC ajax的另一个表单也会回发,因此,这两个操作都在触发,而返回JavaScriptResult的操作是第二个触发的。我还是不知道如何防止这种行为..。
更新:
见下面的答案
发布于 2012-05-22 02:23:48
回答这里,希望它能帮助别人。
我修改了所有涉及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-22 01:23:53
我想您应该避免HTML表单嵌套,以消除这个问题。这在语义上也不正确。
在ASP.NET WebForms时代,这是一个问题,但是使用ASP.NET MVC应该容易得多。
https://stackoverflow.com/questions/10698697
复制相似问题