【问题标题】:Json Url.Action failing in new MVC 5 appJson Url.Action 在新的 MVC 5 应用程序中失败
【发布时间】: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


【解决方案1】:

Visual Studio 2013,更新 2,MVC 模板不安装 jquery.unobstrusive-ajax.js 脚本。我在我的 BundleConfig 中添加了它,但它没有安装在 Script 文件夹中。一旦安装 AjaxOnSuccess 就开始工作了。

【讨论】:

    【解决方案2】:

    这两个脚本是从 VS2013 的模板中删除的。我已经与编辑/模板团队进行了交谈,当我获得有关该计划的更多信息时,我们会在此处更新。

    【讨论】:

    • 你的正确之处在于我安装了 RC。我刚刚安装了 Update 2 的最终版本,但 MVC 模板仍然没有安装 jquery.unobstrusive-ajax.js 脚本。
    • 是的,我混淆了另一个被删除的脚本(jQuery 验证)。我与模板团队中合适的人进行了交谈,我们将看看是否要恢复它。
    • 模板安装 jquery.validate.js 但不安装 jquery.unobstrusive-ajax.js 和 jquery-ui.js。我不得不手动安装这两个。
    • 是的,我们正在看看,当我知道更多时会更新。与此同时,我正在编辑答案
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多