如何为Razor Views创建默认的AjaxOptions?

时间:2011-03-31 12:27:51

标签: c# ajax asp.net-mvc-3 razor

如何创建默认AjaxOptions?例如,我有一个带有一些链接的菜单,我想让整个网站使用相同的loading element和相同的error handling

@Ajax.ActionLink("Home", "Index", "home", <AjaxOptions>)

new AjaxOptions()
{
    OnFailure = "handleError",
    LoadingElementId = "loading"
});

但后来我有一些更新内容的链接,我想为每个链接设置UpdateTargetId。如何在所有视图上保留默认错误处理和加载元素,并为每个链接仅编辑UpdateTargetIdOnSuccess(或其他属性)?

这样的东西
@Ajax.ActionLink("home", "Index", "home", ajaxOption.UpdateTargetId = "content")
@Ajax.ActionLink("menu", "Foo", "home", ajaxOption.UpdateTargetId = "side-content")

我想要一些等同于jQuery.setup的东西,我可以将默认值设置为ajax请求,当我发出ajax请求时,我只告诉我要覆盖的参数......

2 个答案:

答案 0 :(得分:8)

您可以执行以下操作:

public static class AjaxExtensions
{
    public static IHtmlString DefaultLink(this AjaxHelper helper, string text,
        string action, string controller, string updateTargetId = "", 
        string onSuccess = "")
    {
        // Build your link here eventually using 
        // the arguments passed
        var options = new AjaxOptions
        {
            OnSuccess = onSuccess,
            UpdateTargetId = updateTargetId,
            OnFailure = "handleError",
            LoadingElementId = "loading"
            // etc...
        }

        // return a normal ActionLink passing your options
        return helper.ActionLink(text, action, controller, options);
    }
}

注意我在签名中使用了可选参数,以便从多个重载的灵活性中受益,而不会对维护它们造成麻烦。根据需要展开:)

然后按如下方式使用它:

@Ajax.DefaultLink("home", "Index", "home", updateTargetId: "content")

答案 1 :(得分:7)

我发现继承AjaxOptions类并在视图中实例化DefaultAjaxOptions更容易。这意味着如果您有其中一个没有创建单独的扩展方法,您可以将它用于Ajax.ImageActionLink之类的东西。看下面的例子,我唯一需要改变的就是目标,所以我允许将它传递给构造函数。

public class DefaultAjaxOptions : AjaxOptions
{
    public DefaultAjaxOptions(string target)
    {
        InsertionMode = InsertionMode.Replace;
        UpdateTargetId = target;
        OnBegin = "BeginLoadingSection()";
        OnFailure = "FailureLoadingSection()";
        OnSuccess = "SuccessLoadingSection()";
    }
}

然后在视图中使用:

@{ var ajaxOptions = new DefaultAjaxOptions("name-of-content-div"); }