Ajax.ActionLink не вызывает действия контроллера - PullRequest
4 голосов
/ 22 февраля 2012

Я отображаю список файлов и позволяю пользователю удалить из списка. Кнопка удаления выполняет ajax-вызов контроллера, чтобы выполнить действие «Удалить». Однако действие удаления никогда не вызывается. Я получаю уведомление о подтверждении, определенное в AjaxOptions. Что бы это ни стоило, я работал с использованием движка WebForms и просто перенес его в Razor. Кроме того, я впервые использую Области. Если я вызываю действие «Удалить» напрямую, оно работает. Это проблема маршрутизации?

Вот код, стоящий за

  public EmptyResult Delete(string fileName)
    {
        if (fileName.IsNullOrEmpty()) return null;
        var model = new Models.BenefitBookletModel();
        model.DeleteBooklet(fileName);
        return null;
    }

Вот наценка

    @Ajax.ActionLink("test", "Delete", new { fileName = item.FileName }, new AjaxOptions
                                                                                 {
Confirm = "Are you sure you want to delete " + item.FileName + "?",
OnComplete = "function(){deleteComplete('" + item.jsReferenceableFileName + "')}",
HttpMethod = "DELETE",
OnFailure = "function(){alert('Could not delete file');}"
              }, new { @class = "DeleteButton" }
                                                                             )

Вот мой регистрRoutes

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute("SubscriberAll","subscriber/{id}",new { controller = "Subscriber", action = "ShowAll" },new { id = @"\d+" } );
        routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });

Маршруты из области регистрации

context.MapRoute("Marketing_default","Marketing/{controller}/{action}/{id}",new { action = "Index", id = UrlParameter.Optional }

Вот сгенерированная разметка

<a href="/Marketing/BenefitBooklet/Delete?fileName=MyFileName.pdf" data-ajax-method="GET" data-ajax-failure="function(){alert('Could not delete file');}" data-ajax-confirm="Are you sure you want to delete MyFileName.pdf?" data-ajax-complete="function(){deleteComplete('MyFileName.pdf')}" data-ajax="true" class="DeleteButton"> </a>

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

Вы должны указать имя функции в качестве значения соответствующего свойства AjaxOptions. Добавить script раздел:

<script type="text/javascript">
    function OnFailure(request, error) {
        alert('Could not delete file');
    }
    function OnComplete(request, error) {
        alert('Delete complete');
    }
</script>

на ваш взгляд и измените OnFailure и OnComplete в 'AjaxOptions':

OnFailure = "OnFailure"
OnComplete= "OnComplete"
1 голос
/ 23 февраля 2012

Вы определяете HttpMethod ссылки на действие как DELETE, но ваш метод, вероятно, принимает только GET.Попробуйте украсить его глаголом «Удалить».

[HttpDelete]
public EmptyResult Delete(string fileName)
...