问题设置MVC中的级联下拉

时间:2012-03-07 19:28:42

标签: asp.net-mvc-3 cascadingdropdown view-helpers

我一直在尝试在答案here

中实现代码

问题是: -

  1. 设置或创建帮助
  2. 将帮助器集成到视图上以执行CascadingDropDropListFor
  3. 在第一天我尝试为帮助者创建一个新类,然后我将代码移动到我现有的页面模型中,但发现如果我这样做它解决了问题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中实现级联下拉列表的一种更简单的方法,我会尝试相反但我已经在查看其他一些搜索结果了,这就是我拥有的那个最容易实施。

    无论如何,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用http://awesome.codeplex.com中的AjaxDropdown,您不再需要编写javascript

答案 1 :(得分:1)

使用

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

而不是

using System.Web.WebPages.Html;