一、Native Ajax Support

Vici MVC支持AJAX调用,这意味着你可以在javascript中调用服务器方法,这种情况同样可以出现在 controllers, view components, forms and controls。借助ajax插件,框架将会在呈现的HTML中自动javascript 调用和申明。ajax插件将从客服端调用服务器方法,并且处理必要的管道。

Vici MVC中自带的ajax插件是:

   jQuery 1.2 and higer

如果你要调用其他的ajax提供者你只需要在application's Init()中申明一下即可(默认使用的就是jquery,如果你也要使用jquery,那么你就不需要做任何定义


public static void Init()
{
   WebAppConfig.AjaxProvider = new
   MootoolsAjaxProvider();
}

二、Creating Ajax methods
创建一个ajax很方便,只需要在方法上添加属性[ajax]
public class AjaxDemoController : Controller
{
   public void Run()
   {
   }

   [Ajax]
   public static void GetItemCount(string filter)
   {
       return DataLayer.GetItemCount(filter);
   }
}

然后你就可以在javascript中按下面方法调用:
<mce:script type="text/javascript"><!--
AjaxDemoController.GetItemCount("*" , function(result) { $("#ItemCount").text(result); });
// --></mce:script>

ajax只能够被异步调用,这就是为什么你要指定将接收返回值作为第一个参数的 ajax 调用的回调函数。
你还可以添加一个在调用失败返回的函数,回调函数返回的参数不是关于服务器的就是客户端的错误信息。

<mce:script type="text/javascript"><!--
AjaxDemoController.GetItemCount("*" , 
                          function(result) { $("#ItemCount").text(result); } , 
                          function(errMsg) { alert(errMsg); } );
// --></mce:script>
Returning complex objects from Ajax methods

我们不限制于ajax返回的都是基本数据类型,你也可以让它返回对象。但有一点你必须注意,任何类型都是由数组的方式返回,所以当你返回的是一个

list类型的话,你不能用一般的list调用方法来调用,你应该按下面方法:
public class AjaxDemoController : Controller
{
    public void Run()
    {
        //...
    }

    [Ajax]
    public static object GetItemInfo()
    {
        return new 
            {
                LastUpdate = DateTime.Now,
                ActiveItems = DataLayer.GetActiveItems(),    // returns a List<>
                InactiveItems = DataLayer.GetInactiveItems() // returns a List<>
            };
   }
}

javascript:
<mce:script type="text/javascript"><!--
function handleInfoResponse(info)
{
    $("#LastUpdateSpan").text(info.LastUpdate);

    for (var i in info.ActiveItems)
        handleItem(info.ActiveItems[i]); // do something with the item

    for (var i in info.InactiveItems)
        handleItem(info.InactiveItems[i]); // do something with the item
}

AjaxDemoController.GetItemInfo(handleInfoResponse);
// --></mce:script>

四、Renaming Ajax methods

[ajax]还能够添加一个参数:ajax方法的化名。默认,javascript中调用ajax的方法名字是命名空间加控制器类加方法三者组成的,请看上面的例子。这样

就会看起来很长,所以我们建议给ajax方法取个化名。
public class AjaxDemoController : Controller
{
    public void Run()
    {
        // ...
    }

    [Ajax("ajaxItemCount")]
    public static void GetItemCount(string filter)
    {
        return DataLayer.GetItemCount(filter);
    }
}

javascript:<mce:script type="text/javascript"><!--
    ajaxItemCount("*" , function(result) { $("#ItemCount").text(result); });
// --></mce:script>
Returning XML from Ajax methods


有时候你希望从ajax方法返回的是xml,你可以通过调用框架利用自动拦截xml来实现。一个返回值是xml的ajax方法它会传递一个xml 文档给回调函数
,而不是一个字符串。
要让ajax方法返回的是一个xml,你只需要在[ajax]属性中添加一个参数 ReturnXml并让它为真。 [Ajax(ReturnXml = true)] public string MyXmlAjaxMethod() { return "<?xml version=/"1.0/"?><taconite></taconite>"; } 六、Ajax methods in forms, controls and view components 你同时可以在 form, custom control or view component中调用ajax方法。 每当呈现窗体、 控件或视图的组件,这些类中定义的 Ajax 方法将在客户端的 javascript 中可用。 唯一的限制是 Ajax 方式对窗体、 控件和视图组件应声明为静态的,因为一旦视图已被呈现到客户端实例的行为将不可用。
六、 Adding ajax methods defined in an external class
你可以在控制器类中调用 RegisterAjaxMethods()实现在任何视图中定义ajax方法。下面是一个客户端代码中使用的 ajax 实用

程序方法的集合类。

public static class AjaxTools
{
    [Ajax]
    public static int GetFreeDiskspace()
    {
        return DiskspaceHelper.CalcFreeDiskspace()
    }

    [Ajax]
    public static string ResolveDomainName(string domain)
    {
        return IPHelper.ResolveDomain(domain);
    }
}