MVC3 Ajax.ActionLink导致文件打开对话框

时间:2011-09-26 17:41:43

标签: json asp.net-mvc-3

我有一个带有以下Ajax.ActionLink定义的视图

@Ajax.ActionLink(@Model.Game.VisitorTeam.FullName, "SelectTeam", new { gameID = @Model.Game.GameID, pickID = @Model.Game.VisitorTeam.TeamID }, new AjaxOptions { HttpMethod = "POST", OnSuccess = "pickMade" }, new { id = "vpick-" + @Model.Game.GameID });

这是我的控制器中定义的Action。

public JsonResult SelectTeam(int gameID, int pickID) {
    var user = Membership.GetUser(User.Identity.Name);
    var message = "Pick Submitted";
    var userID = (Guid) user.ProviderUserKey;
    _pickService.SubmitPick(userID, gameID, pickID);

    return Json(new {id = gameID, teamID = pickID, message}, JsonRequestBehavior.AllowGet);

 }

当我点击页面上的链接时,它会在我的控制器中回复我的Action,执行代码并返回Json结果。但是,一旦客户端获得结果,浏览器将打开“另存为”对话框。如果我保存文件,这是我的Json结果,按预期返回。我不知道为什么没有调用我的'pickMade'函数来处理回发的结果。

在我的其他应用程序中,我正在使用[AcceptVerbs(HttpVerbs.Post)]属性。但是,如果我在此应用程序中尝试此操作,则从我的视图中调用操作时会出现404错误。如果我删除该属性,我必须将JsonRequestBehavior.AllowGet添加到我的返回值。

我在另一个应用程序中有非常相似的功能,它工作正常。我不确定发生了什么,所以感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

你有2个解决方案(我猜)。

第一个解决方案(不是最好的解决方案):

1 /在Web.config中停用不显眼的Javascript

<appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="false" />
</appSettings>

2 /包括MicrosoftAjax.js和MicrosoftMvcAjax.js脚本文件

<script src="@Url.Content("~/Scripts/MicrosoftAjax.debug.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.debug.js")" type="text/javascript"></script>

第二种解决方案(更好):

1 /保持启用不显眼的Javascript(默认情况下)

  <appSettings>
      <add key="ClientValidationEnabled" value="true" />
      <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>

2 /包含jquery-unobtrusive javascript文件。

  <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
  <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>

已多次出现此问题而且我一直都在工作:/!