提交表单返回的是 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类型数据

Feign表单提交

PHP表单提交失败,如何返回原值?

请求头header里的contentType为application/json和capplition/x-www-form-urlencoded

js 提交的表单后如何在本页面接收返回值