/ / MVC3 Ajax.ActionLink powoduje otwarcie okna dialogowego pliku - json, asp.net-mvc-3

MVC3 Ajax.ActionLink powoduje otwarcie okna dialogowego pliku - json, asp.net-mvc-3

Mam widok ze zdefiniowanym następującym 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 });

Oto akcja zdefiniowana w moim kontrolerze.

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);

}

Kiedy klikam link na stronie, publikuje postydo mojej akcji w moim kontrolerze w porządku, wykonuje kod i zwraca wynik Jsona. Jednak gdy klient otrzyma wynik, przeglądarka otwiera okno dialogowe „Zapisz jako”. Jeśli zapiszę plik, jest to mój wynik Jsona, zwracany zgodnie z oczekiwaniami. Nie wiem, dlaczego moja funkcja „pickMade” nie jest wywoływana do obsługi wyniku z postback.

W mojej innej aplikacji używamAtrybut [AcceptVerbs (HttpVerbs.Post)]. Jeśli jednak spróbuję tego w tej aplikacji, podczas wywoływania akcji z mojego widoku pojawia się błąd 404. Jeśli usunę atrybut, muszę dodać JsonRequestBehavior.AllowGet do mojej zwracanej wartości.

Mam bardzo podobną funkcjonalność w innej aplikacji i działa dobrze. Nie jestem pewien, co się dzieje, więc każda pomoc jest doceniana.

Odpowiedzi:

3 dla odpowiedzi № 1

Masz 2 rozwiązania (tak myślę).

Pierwsze rozwiązanie (nie najlepsze):

1 / Dezaktywacja dyskretnego Javascript w twojej Web.config

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

2 / Łącznie z plikami skryptów MicrosoftAjax.js i 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>

Drugie rozwiązanie (lepsze):

1 / Włącz dyskretną obsługę Javascript (domyślnie)

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

2 / Dołącz niepozorne dla jaquera pliki 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>

Miałem już ten problem wiele razy i zawsze działałem: /!