Проблема с настройкой каскадных раскрывающихся списков в MVC

Я пытался реализовать код в ответе здесь

Проблемы: -

  1. Настройка или создание помощника
  2. интеграция помощника в представление для выполнения CascadingDropDropListFor

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

Чтобы решить проблему 1, я попытался ввести столько «Использований», сколько необходимо, чтобы весь код работал, а затем обнаружил, что Web.Mvc.Html предназначен для ее решения, но не сделал этого и вызвал еще одну ошибку.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;

я нашел это

using System.Web.WebPages.Html;

Решена проблема с Html.SelectExtension, которая показана ниже.

Имя «Html» не существует в текущем контексте

Но вызвало

«SelectListItem» — это неоднозначная ссылка между «System.Web.Mvc.SelectListItem» и «System.Web.WebPages.Html.SelectListItem».

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

            public static class MvcHtmlExtensions
    {
        public static MvcHtmlString CascadingDropDownListFor<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper,
            Expression<Func<TModel, TProperty>> expression,
            IEnumerable<SelectListItem> selectList,
            string optionLabel,
            IDictionary<string, Object> htmlAttributes,
            string parentControlName,
            string childListUrl
            )
        {
            var memberName = GetMemberInfo(expression).Member.Name;
            MvcHtmlString returnHtml = Html.SelectExtensions.DropDownListFor(htmlHelper, expression, selectList, optionLabel, htmlAttributes);
            var returnString = MvcHtmlString.Create(returnHtml.ToString() +
                @"<script type=""text/javascript"">
                    $(document).ready(function () { 
                        $(""#<<parentControlName>>"").change(function () {                                  
                            var postData = { <<parentControlName>>: $(""#<<parentControlName>>"").val() };                                 
                            $.post('<<childListUrl>>', postData, function (data) {                                     
                                var options = """";                                     
                                $.each(data, function (index) {                                         
                                    options += ""<option value='"" + data[index].Id + ""'>"" + data[index].Name + ""</option>"";                                     
                                });                                     
                                $(""#<<memberName>>"").html(options);                                 
                            })                                 
                            .error(function (jqXHR, textStatus, errorThrown) { alert(jqXHR.responseText); });                             
                        });                         
                    });                      
                </script>"
                .Replace("<<parentControlName>>", parentControlName)
                .Replace("<<childListUrl>>", childListUrl)
                .Replace("<<memberName>>", memberName));
            return returnString;
        }
        private static MemberExpression GetMemberInfo(Expression method)
        {
            LambdaExpression lambda = method as LambdaExpression;
            if (lambda == null)
                throw new ArgumentNullException("method");
            MemberExpression memberExpr = null;
            if (lambda.Body.NodeType == ExpressionType.Convert)
            {
                memberExpr = ((UnaryExpression)lambda.Body).Operand as MemberExpression;
            }
            else if (lambda.Body.NodeType == ExpressionType.MemberAccess)
            {
                memberExpr = lambda.Body as MemberExpression;
            }
            if (memberExpr == null)
                throw new ArgumentException("method");
            return memberExpr;
        }
    }
}

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

В любом случае любая помощь будет высоко оценена.


person Myzifer    schedule 07.03.2012    source источник


Ответы (2)


используйте AjaxDropdown из http://awesome.codeplex.com, и вам больше не нужно будет писать javascript

person zazels    schedule 07.03.2012
comment
Я посмотрел на это, но проблема заключается в том, чтобы выяснить, что именно мне нужно от всего проекта, который включает в себя многое, сейчас я взгляну на него еще раз, но если есть какие-то ключевые вещи, которые вы думаете, я должен искать эту потребность для копирования непосредственно через конкретный код jscript или контроллера, тогда все поможет, спасибо. - person Myzifer; 08.03.2012
comment
Хорошо, я, наконец, заставил его работать прошлой ночью, но оказалось, что ему не нравятся сложные ссылки на объекты, поэтому я не мог ссылаться на идентификатор для записи таблицы в модели представления, поэтому просто должен был сделать int и использовать его как объект, затем отсортируйте соединение в контроллере. Кроме того, мне не понравилось, что он отказывался принимать edmx и требовал использования dbml для linq to sql. - person Myzifer; 09.03.2012

Использовать

System.Web.Mvc.Html.SelectExtensions.DropDownListFor(..);

вместо

using System.Web.WebPages.Html;
person Nawaz    schedule 08.02.2013