【发布时间】:2014-05-12 01:02:34
【问题描述】:
我在我的应用程序中广泛使用了return Json(new { url = Url.Action("MyAction", new { param = 1 }。我最近将一个 MVC 4 应用程序迁移到 MVC 5,它仍然可以工作,但是如果我使用 Visual Studio 2013 更新 2(它模板化 MVC 5、EF 6.1 和 Identity 2 应用程序)构建一个新的 MVC 应用程序,它现在无法重定向并且 json被发送到浏览器:
Do you want to open or save 23xdf543v.json (28 bytes) from localhost
(为了获得 Identity 2 设置,我创建了一个新的 MVC 5 应用程序并将我所有的 MVC 4 应用程序文件复制到其中并进行了重构以使其正常工作)。
如果我打开 JSON,则 URL 的格式似乎正确。 (在本例中,MyAction 在 MyController 中)
{"url":"/MyController/MyAction/1"}.
奇怪的是,它适用于从 MVC 4 迁移到 MVC 5 的应用程序,但不适用于新模板化的 MVC 5 应用程序。
行动:
public ActionResult Phn2Add(PhoneVm vM)
{
if (ModelState.IsValid)
{
_db.Phones.Add(vM.Phone); _db.SaveChanges();
return Json(new { url = Url.Action("Details", new { id = vM.DetailsId }) });
}
ModelState.AddModelError(string.Empty, ErMsInvldEdt);
PhTyDrpDwn();
return PartialView("Add_Del/_PhnAdd", vM);
}
查看:
@model MyApplicaiton.ViewModels.PhoneVm
@{ ViewBag.Title = "Add"; }
<script type="text/javascript">
var onSuccess = function (result) { if (result.url) { window.location.href = result.url; } }
</script>
<div id="PhnAdd">
<div style="padding-left:17px">
<h3>Add a @Model.Msg? @Html.ActionLink("CANCEL", null, new { id = Model.DetailsId }) </h3>
</div>
@using (Ajax.BeginForm(@Model.ActnNm, new AjaxOptions
{
OnSuccess = "onSuccess", UpdateTargetId = "PhnAdd", HttpMethod = "Post"
}))
{ @Html.AntiForgeryToken() @Html.ValidationSummary(true)
<fieldset> <legend></legend><br />
@Html.HiddenFor(m => m.Phone.PersonId) @Html.HiddenFor(m => m.DetailsId)
@Html.HiddenFor(m => m.ActnNm) @Html.HiddenFor(m => m.Msg)
<table>
<tr>
<th><span class="editor-label">Number: (7573334444)</span></th>
<td>
<span class="editor-field">@Html.EditorFor(m => m.Phone.Number) @Html.ValidationMessageFor(m => m.Phone.Number) </span>
</td>
</tr>
<tr>
<th><span class="editor-label">Type: Land or Mobile</span></th>
<td><span class="editor-field">@Html.DropDownList("Phone.Type", (IEnumerable<SelectListItem>)ViewBag._PhTyp)
@Html.ValidationMessageFor(m => m.Phone.Type) </span>
</td>
</tr>
</table>
<input type="submit" value="Add" />
</fieldset>
}
</div>
MVC 5 处理 Url.Action 的方式不同吗? javascript 对OnSuccess 的处理是否有一些变化?是否有需要更改的设置?
【问题讨论】:
-
返回的 JSON 对我来说看起来不错。以前是什么样子的?您是否在 Ajax 调用中将其返回,而现在只是直接返回到浏览器?
-
在我的视图中,它与 AJax.BeginForm 一起用于我的许多控制器动作中。迁移到 MVC 5 的 MVC 4 和新模板化的 MVC 5 应用程序之间的代码是相同的。我什么都没改变。
-
这不算。您能否分享一个非常简单的代码复制、一个控制器操作(或两个以包含初始视图)和一个视图?我的猜测是您试图将 json 作为页面而不是 Ajax 提供。但是既然你说都是一样的,那么一个样本就可以说明发生了什么
-
我同意,这没有意义。我已经向 OP 添加了一个 Action 和 View。
标签: javascript asp.net-mvc json asp.net-ajax