Вызов Webpart для веб-обработчика

У меня есть веб-часть, которая вызывает обработчик ASP.NET для выполнения функции автозаполнения.

ASHX File
    <%@ WebHandler Language="C#" Class="MyService.MyAutoComplete" CodeBehind="MyAutoComplete.ashx.cs" %>

Код за файлом

namespace MyService
{
    /// <summary>
    /// Summary description for MyAutoComplete
    /// </summary>
    public class MyAutoComplete : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            var searchTerm = context.Request.QueryString["term"].ToString();

            context.Response.Clear();
            context.Response.ContentType = "application/json";


            var search = GetList();

            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            string json = jsSerializer.Serialize(search);
            context.Response.Write(json);
            context.Response.End();
        }

    }
}

Это мой вызов JQuery

$(function () {
            $("#<%= txtSearchInput.ClientID %>").autocomplete({
                source: "/_Layouts/My Service/MyAutoComplete.ashx",
                minLength: 2,
                select: function (event, ui) {
                    $(this).val(ui.item.value);
                }
            });
        });

«Моя служба» - это папка макета SharePoint внутри проекта веб-части.

Когда я выполняю вызов через JQuery, он выдает следующую ошибку: «Не удалось создать тип MyService.MyAutoComplete».

Любая помощь приветствуется.


person Yass    schedule 29.04.2012    source источник
comment
Вы добавляете ссылку на этот файл dll? Если не добавляете и не пересобираете приложение.   -  person coder    schedule 30.04.2012
comment
@coder обработчик является частью проекта веб-части. Так что я не думаю, что нам нужны какие-либо ссылки.   -  person Yass    schedule 30.04.2012
comment
Также я думаю, что у вас может быть небольшая проблема с вызовом вашего обработчика. Вы указываете относительный URL-адрес / _Layouts / My Service / MyAutoComplete.ashx для автозаполнения jQuery, поэтому он будет вызывать его из корневого веб-сайта семейства сайтов, и поэтому у вас могут возникнуть проблемы с разрешениями, запросом списков и т. Д. Конечно, я могу Не претендую на это определенно, возможно, это часть вашего дизайна. Но посмотрите на SharePoint js api SP.Utilities.Utility.getLayoutsPageUrl ([yourHandlerUrl]) msdn.microsoft.com/en-us/library/ee659418.aspx Он сгенерирует URL-адрес в соответствии с текущим веб-сайтом в семействе сайтов.   -  person Oleg Savelyev    schedule 30.04.2012


Ответы (2)


При реализации IHttpHandler необходимо предоставить реализацию для:

Следовательно, нельзя создать экземпляр класса MyAutoComplete, поскольку он не обеспечивает реализацию для всех абстрактных членов IHttpHandler.

Поскольку ваш обработчик явно не имеет состояния, вы можете реализовать IsReusable следующим образом:

public bool IsReusable
{
   get {
       // Handler is stateless, we can reuse the same instance
       // for multiple requests.
       return true;
   }
}
person Frédéric Hamidi    schedule 30.04.2012
comment
Благодарю за ваш ответ. Я не включил интерфейс IsReusable, чтобы сэкономить здесь место. Если мы не реализуем интерфейс, код даже не компилируется, вы получаете ошибку времени компиляции. - person Yass; 30.04.2012

Кажется, у компонентов SharePoint есть свой способ их идентификации :). После поиска в Google я нашел следующее решение.

<%@ WebHandler Language="C#"  Class="MyService.MyAutoComplete,MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=87c41094797c589e" %>
person Yass    schedule 01.05.2012