jQuery Autocomplete throws 401 - Несанкционированная ошибка при вызове метода действия контроллера MVC 3 - PullRequest
1 голос
/ 15 декабря 2011

Я получаю сообщение об ошибке «401 - неавторизовано» в элементе управления автозаполнением jQuery в приложении MVC3 (.net framework v4.0.30319), которое развернуто на сервере, содержащем IIS 7.5

Контроллер: (SearchSuggestController)

    [HttpGet]
    public JsonResult SuggestByEmployeeId(string Id)
    {
        var suggestions = from a in Context.Employees
                          where a.EmployeeId.Contains(Id)
                          select new
                          {
                              a.EmployeeId,
                              a.FirstName,
                              a.LastName
                          };
        return Json(suggestions, JsonRequestBehavior.AllowGet);
    }

jQuery: (автозаполнение)

$(function () {
    $("#IDFilter").autocomplete({source: function (request, response) {
            $.ajax({
                url: "/SearchSuggest/SuggestByEmployeeId", 
                type: "POST", 
                dataType: "json",
                data: { Id: request.term },
                error: function (XMLHttpRequest, status, error) {
                    alert("Error status:(" + status + ") error:(" + error + ")");
                },
                success: function (data) {
                    response($.map(data, function (item) {
                        return { label: item.EmployeeId, value: item.EmployeeId,id: item.EmployeeId };
                    }));
                }
            });
        },
        minLength: 3,
        autoFocus: true,
        select: function (event, ui) {
            $("#IDFilter").val(ui.item.value);
        }
    });});

jQuery вызывает url: "/ SearchSuggest / SuggestByEmployeeId" т.е. действие SuggestByEmployeeId контроллера SearchSuggest.

Search.cshtml: (просмотр)

@using (Html.BeginForm("BasicSearch", "Employee"))
{
 @Html.Label("Employee Id:")
 @Html.TextBox("IDFilter")
<input type="submit" value="Search" />
}

Метод действия BasicSearch в контроллере Employee работает нормально, если в «IDFilter» введен действительный идентификатор EmployeeID и нажата кнопка «Поиск».

При автозаполнении отображаются ожидаемые результаты при выполнении кода черезвизуальная студия IDE.После публикации Bin и развертывания этого кода в IIS 7.5 выдает 401-Unauthorized error.Приложение размещено на веб-сайте по умолчанию в IIS.

Кто-нибудь знает, что здесь происходит не так?

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Я думаю, что у меня есть решение.

Копание в jQuery с использованием IE8 Developer Tools

На хост-сервере автозаполнение XMLHttpRequest пытается найти URL запроса "http://localhost:80/SearchSuggest/SuggestByEmployeeId?Id=123"

Но мое приложение размещено как «MyApp» на веб-сайте по умолчанию, поэтому URL-адрес должен быть таким, как "http://localhost:80/MyApp/SearchSuggest/SuggestByEmployeeId?Id=123"

Следовательно, я обновил URL-адрес до url: "/MyApp/SearchSuggest/SuggestByEmployeeId"

После этогоизменить Автозаполнение извлекает ожидаемые результаты.Ошибка 401 исчезла.

Вероятно, в хост-среде мне придется настроить новый веб-сайт, и бин развернет мое приложение MVC под этим.Таким образом, мне не нужно каждый раз вносить эту модификацию в jQuery.

Если у кого-то есть лучшее решение, предложите.

1 голос
/ 13 апреля 2012

Чтобы избежать проблем с относительными путями, вместо жесткого кодирования URL, используйте помощник @URL.Action.

Итак, ваш старый код: url: "/SearchSuggest/SuggestByEmployeeId",должно стать: url: '@Url.Action("SuggestByEmployeeId", "SearchSuggest")'

Удачи!

1 голос
/ 15 декабря 2011

Вы AJAX POST к действию, но ваше действие принимает только GET?

Имеет ли ваш контроллер (или базовый контроллер) атрибут [Authorize]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...