Задача: реализовать поддержку асинхронных обращений к серверу на базе фреймворка MVC, а именно, задействовать контроллер для обработки HttpXmlRequest-запросов без использования WebService'ов.
Добавляем в контроллер метод GetDate(), вместо this.View() возвращаем new JsonResult(){ … }:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcAjaxJsonSample.Controllers
{
[HandleError]
public class TestController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult GetDate()
{
var result = new JsonResult() { Data = new { d = new { Date = DateTime.UtcNow } } };
return result;
}
}
}
В поле Data складываем то, что хотим передать на клиента. Далее создаем js-файл, в котором определяем Behavior:
Type.registerNamespace("MvcAjaxJsonSample.Content");
MvcAjaxJsonSample.Content.DateTimeViewer = function(element) {
MvcAjaxJsonSample.Content.DateTimeViewer.initializeBase(this, [element]);
}
MvcAjaxJsonSample.Content.DateTimeViewer.prototype = {
_serverAddress: null,
initialize: function() {
MvcAjaxJsonSample.Content.DateTimeViewer.callBaseMethod(this, 'initialize');
// Add custom initialization here
},
dispose: function() {
//Add custom dispose actions here
MvcAjaxJsonSample.Content.DateTimeViewer.callBaseMethod(this, 'dispose');
},
set_serverAddress: function(serverAddress) {
this._serverAddress = serverAddress;
},
get_serverAddress: function() {
return this._serverAddress;
},
update: function() {
Sys.Net.WebServiceProxy.invoke(this._serverAddress, "GetDate", false, null,
Function.createDelegate(this, this._requestComplete),
function(ex) {
alert(ex);
},
null);
},
_requestComplete: function(result) {
var element = this.get_element();
element.innerText = result.Date;
}
};
MvcAjaxJsonSample.Content.DateTimeViewer.registerClass('MvcAjaxJsonSample.Content.DateTimeViewer', Sys.UI.Behavior);
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
Метод update будет вызываться из клиента, когда пользователь захочет узнать серверное время.
Sys.Net.WebServiceProxy.invoke — обертка над HttpXmlRequest, автоматизирующая получение данных из Web-сервиса в Json формате, но при этом нормально работает и с MVC контроллерами. Единственный нюанс в том что, распаковка результата вызова метода WebService устроена так, что требует упаковывать возвращаемые данные в анонимный (или обычный) тип в свойство с именем d:
JsonResult() { Data = new { d = [возвращаемые значения] } };
aspx-страница имеет следующий вид:
AJAX MVC Sample
Вызываем метод, который запрашивает серверную дату и время
Получить серверное время
Скачать проект для MVC Preview 4(202 кб.)
Скачать проект для MVC Preview 5(218 кб.)