Задача: реализовать поддержку асинхронных обращений к серверу на базе фреймворка 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

Вызываем метод, который запрашивает серверную дату и время

Получить серверное время

Visual Studio 2008 SolutionСкачать проект для MVC Preview 4(202 кб.)

Visual Studio 2008 SolutionСкачать проект для MVC Preview 5(218 кб.)