Как создать AjaxOptions по умолчанию для Razor Views? - PullRequest
9 голосов
/ 31 марта 2011

Как мне создать значение по умолчанию AjaxOptions? Например, у меня есть меню с некоторыми ссылками, я хочу, чтобы весь сайт использовал тот же loading element и тот же error handling.

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

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

Но затем у меня есть несколько ссылок, которые обновляют содержимое, и я хочу установить UpdateTargetId для каждой из этих ссылок. Как сохранить элемент обработки ошибок по умолчанию и загрузить элемент во все представления и редактировать только UpdateTargetId или OnSuccess (или другое свойство) для каждой ссылки?

Что-то вроде

@Ajax.ActionLink("home", "Index", "home", ajaxOption.UpdateTargetId = "content")
@Ajax.ActionLink("menu", "Foo", "home", ajaxOption.UpdateTargetId = "side-content")

Я хочу что-то эквивалентное jQuery.setup, где я могу установить значения по умолчанию для запросов ajax, и когда я делаю запрос ajax, я только сообщаю параметры, которые хочу переопределить ...

Ответы [ 2 ]

8 голосов
/ 31 марта 2011

Вы можете сделать что-то вроде:

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")
7 голосов
/ 07 июня 2011

Мне стало проще наследовать класс 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"); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...