Это появляется тот вызов Html.RenderAction
у Asp. Сетевые приложения MVC2 могут изменить тип пантомимы страницы, если тип дочернего действия отличается, чем родительское действие.
Код ниже (тестирующий в MVC2 RTM), который кажется разумным мне, возвратит результат типа application/json
при вызове Home/Index
. Вместо dispylaying страница браузер будет блевать и спрашивать Вас, если Вы захотите загрузить его.
Мой вопрос: я пропускаю что-то? Действительно ли это - ошибка? Если так, каково лучшее обходное решение?
контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData[ "Message" ] = "Welcome to ASP.NET MVC!";
return View();
}
[ChildActionOnly]
public JsonResult States()
{
string[] states = new[] { "AK", "AL", "AR", "AZ", };
return Json(states, JsonRequestBehavior.AllowGet);
}
}
посмотреть:
<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<script>
var states = <% Html.RenderAction("States"); %>;
</script>
Это не ошибка. Тип JsonResult
должен устанавливать результат в JSON, потому что обычно это то, что вам нужно.
Вам действительно не нужен результат JSON здесь, вам нужна строка JSON . Так почему бы просто не написать это?
[NonAction]
public string States()
{
string[] states = new[] { "AK", "AL", "AR", "AZ", };
return new JavaScriptSerializer().Serialize(states);
}
Это можно решить, явно заставив тип mime "вернуться" к text/html
:
return Json(states, "text/html", JsonRequestBehavior.AllowGet);
Однако не похоже, что это необходимо.
Как сказал Craig Stuntz, тип содержимого должен меняться.
Лучшим подходом было бы вызвать это действие с помощью AJAX, а затем присвоить возвращенный объект переменной states
в коде JavaScript.