Ajax Auto Complete в проекте ASP.Net MVC - Как отобразить имя объекта, но сохранить его идентификатор? - PullRequest
0 голосов
/ 24 февраля 2010

Я реализовал функцию автозаполнения Ajax в своем приложении, используя файл веб-сервиса, который запрашивает мою базу данных, и он прекрасно работает. Одна из проблем, с которыми я сталкиваюсь, - это позволить пользователю видеть имя элемента, так как это то, что он печатает в текстовом поле, но когда он выбирает его, он сохраняет идентификационный номер элемента вместо фактического имени. Я хочу, чтобы он вел себя подобно выпадающему списку, в котором я могу указать, что будет видно и введено, а не то, что фактически сохраняется в базе данных (в данном случае идентификатор продукта вместо его имени).

У меня есть это текстовое поле, а также скрипт:

<script type="text/javascript">
    Sys.Application.add_init(function() {
        $create(

        AjaxControlToolkit.AutoCompleteBehavior, {
            serviceMethod: 'ProductSearch',
            servicePath: '/ProductService.asmx',
            minimumPrefixLength: 1,
            completionSetCount: 10
        },
        null,
        null,
        $get('ProductID'))
    });
    </script>
<p>
    <label for="ProductID">Product:</label>
    <%= Html.TextBox("ProductID", Model.Products)%>
    <%= Html.ValidationMessage("ProductID", "*")%>
</p>

Вот что в моем файле asmx:

public class ProductService : System.Web.Services.WebService
{
    [WebMethod]
    public string[] ProductSearch(string prefixText, int count)
    {
        MyDataContext db = new MyDataContext();

        string[] products = (from product in db.Products
                             where product.ProductName.StartsWith(prefixText)
                             select product.ProductName).Take(count).ToArray();
        return products;
    }
}

Может кто-нибудь помочь мне понять это? Я использую это, чтобы они могли просто начать печатать вместо выпадающего списка длиной в милю ...

Ответы [ 2 ]

1 голос
/ 02 марта 2010

элемент управления автозаполнения отправит объект json в "servicePath / serviceMethod", поэтому сначала установите servicePath для вашего контроллера и опцию serviceMethod для вашего имени действия.

затем определите этот класс:

public class AutoCompleteRequest
{
    public string PrefixText { get; set; }
    public int Count { get; set; }
} 

потому что это объект json, который автозаполнение контрольных сообщений отправляет на ваш контроллер.

затем определите JsonModelBinder:

public class JsonBinderAttribute : CustomModelBinderAttribute
{
    public override IModelBinder GetBinder()
    {
        return new JsonModelBinder();
    }

    public class JsonModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            try
            {
                var inputStream = controllerContext.HttpContext.Request.InputStream;
                using (var sr = new StreamReader(inputStream))
                {
                    var json = sr.ReadToEnd();
                    return JsonConvert.DeserializeObject(json, bindingContext.ModelType);
                }
            }
            catch
            {
                return null;
            }
        }
    }
}

этот использует Json.Net в качестве десериализатора.

затем определите свое действие следующим образом:

    public virtual JsonResult SearchA([JsonBinder]AutoCompleteRequest post)
    {
        var data = repository.Query<A>()
            .Where(s => s.Name.StartsWith(post.PrefixText))
            .Take(post.Count)
            .Select(s => s.Name)
            .ToArray();
        return Json(data);
    }

обратите внимание, как я использую JsonBinderAttribute для параметра AutoCompleteRequest и как возвращается массив строк Json.

Редактировать

Я сделал пост в блоге: http://devcarl.posterous.com/how-to-use-ajax-library-4-autocomplete-with-a

1 голос
/ 24 февраля 2010

Хотя это не дает прямого ответа на ваш вопрос, задумывались ли вы об использовании элемента управления автозаполнением Jquery?

По моему опыту, он кажется более гибким, и вы можете связать его с существующей службой и лучше контролировать возвращаемые данные. Здесь ссылка , если это помогает.

...