提交表单返回的是 application/json 而不是 text/html
Posted
技术标签:
【中文标题】提交表单返回的是 application/json 而不是 text/html【英文标题】:Submiting a Form is returning application/json instead of text/html 【发布时间】:2014-01-17 16:26:44 【问题描述】:我已使用以下方式更改了获取提交:
<a style="text-decoration:none;" href="@Url.Action(item.ListAction, item.ListController, new ids = string.Join("-", item.Ids), categoryId = item.Id, search = (string)ViewBag.Search, location = (string)ViewBag.Location )">
收件人:
@using(html.BeginForm(null, null, FormMethod.Post, new id = "homeCategoryForm" ))
@Html.AntiForgeryToken()
@Html.Hidden("ids")
@Html.Hidden("categoryId")
@Html.Hidden("search")
@Html.Hidden("location")
用 JQuery 提交:
$(document).on("click", ".innerelement", function (e)
var elementId = e.target.id.split('_')[1];
action = "/" + $("#controller_" + elementId).val() + "/" + $("#action_" + elementId).val();
$("#homeCategoryForm").attr("action", action);
$("#ids").val($("#ids_" + elementId).val());
$("#categoryId").val($("#categoryId_" + elementId).val());
$("#search").val($("#search_" + elementId).val());
$("#location").val($("#location_" + elementId).val());
$("#homeCategoryForm").submit();
);
控制器:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public virtual ActionResult GetAllByIds(string ids, int categoryId, string search, string location)
AdGetAllByCategoryListViewModel model = new AdGetAllByCategoryListViewModel();
model.Ads = Mapper.Map<IList<AdGetAllByCategoryDto>, IList<AdGetAllByCategoryViewModel>>(_adService.GetAllByIds(ids));
model.Category = Mapper.Map<CategoryDto, CategoryViewModel>(_categoryService.GetById(categoryId));
return View(MVC.Ad.Views.GetAllByCategory, model);
问题是使用 Form Post 方法的 View 生成的是 application/json View (Source) 而不是 text/html。
编辑:
视图是从 PartialView 渲染的,所以可能是问题所在?
我已经用 PartialView 进行了测试,并且视图的 HTML 被渲染但不是所有的布局视图。
知道为什么吗?
谢谢
【问题讨论】:
查看控制器操作([HttpPost] 操作,如果它以这种方式归因)会很有帮助。 这可能与您的观点无关。你的控制器代码是什么? 代码中是否还有其他(重载)“GetAllByIds”? 感谢您这么快的回答,我已经用控制器的代码更新了问题。 您似乎正在使用 View(IView, object) 重载。 MVC.Ad.Views.GetAllByCategory 将负责渲染视图。这段代码很可能负责以 json 格式呈现内容。一个快速的检查方法就是使用 View(object) 重载来确保它按预期工作。 【参考方案1】:我发现了问题:
在视图的布局中我有一个评论表单:
<!-- Comments form container -->
<div class="comentsform">
<!-- Comments form -->
@ Html.RenderAction(MVC.Comment.Create());
</div>
<!-- Comments form container closed -->
控制器是:
public virtual PartialViewResult Create()
return PartialView();
这里的问题是我还有一个 JSON Action 可以通过 jQuery 发送评论:
[HttpPost]
[ValidateAntiForgeryToken]
public virtual JsonResult Create(CommentViewModel commentViewModel)
CommentDto comentDto = Mapper.Map<CommentViewModel, CommentDto>(commentViewModel);
_commentService.Create(comentDto);
commentViewModel.Result = HeelpResources.CommentViewModelResultMsgOk;
return Json(commentViewModel);
所以看起来,当布局来自表单 POST 操作时,它会搜索布局中呈现的 Html.RenderAction 的所有 [HttpPost] 操作。
在这种情况下,因为我有一个带有 JsonResult 类型的 [HttpPost] Action 的 Html.RenderAction,所以所有结果视图都转换为 JSON 响应。
所以现在,我唯一要做的就是将 JSON Action 的名称更改为 public virtual JsonResult CreateSend,例如,问题解决了!
再次感谢大家提供帮助。
【讨论】:
Doode.. 你救了我的一天.. 非常感谢。如果您要发布任何表单,只想为其他阅读此内容的用户添加一件事,请确保您的提交周期中没有任何原始表单(内容类型为 JSON)。例如。如果您有一个包含 2 个表单的页面,其中 1 个在弹出窗口中,另一个在页面上。如果您的弹出表单的内容类型为 JSON,那么您的页面表单将返回内容类型为 JSON 的结果。再次感谢。 嗨@Rushikesh 我很高兴这个问题也帮助了你。弄清楚为什么会发生这种情况真的很复杂。也感谢您的提示。问候。以上是关于提交表单返回的是 application/json 而不是 text/html的主要内容,如果未能解决你的问题,请参考以下文章
JQuery Ajax 设置请求头信息application/json
java分别发送post请求application/x-www-form-urlencoded和application/json类型数据
请求头header里的contentType为application/json和capplition/x-www-form-urlencoded