Asp.net mvc 3 在MVC中设置级联下拉列表的问题

Asp.net mvc 3 在MVC中设置级联下拉列表的问题,asp.net-mvc-3,cascadingdropdown,view-helpers,Asp.net Mvc 3,Cascadingdropdown,View Helpers,我一直在尝试实现答案中的代码 问题是:- 设置或创建辅助对象 将辅助对象集成到视图中以执行CascadingDropDiplistfor 首先,我尝试为助手创建一个新类,然后我将代码移动到页面的现有模型中,但发现如果我这样做,它解决了问题2,只是说我无法将公共静态类嵌套到公共类StudentViewModel中 为了解决问题1,我尝试输入尽可能多的“Using”,以使所有代码正常工作,然后我发现Web.Mvc.Html本来是要解决它的,但没有解决,并导致了另一个错误 using System;

我一直在尝试实现答案中的代码

问题是:-

  • 设置或创建辅助对象
  • 将辅助对象集成到视图中以执行CascadingDropDiplistfor
  • 首先,我尝试为助手创建一个新类,然后我将代码移动到页面的现有模型中,但发现如果我这样做,它解决了问题2,只是说我无法将公共静态类嵌套到公共类StudentViewModel中

    为了解决问题1,我尝试输入尽可能多的“Using”,以使所有代码正常工作,然后我发现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;
            }
        }
    }
    
    公共静态类MvcHtmlExtensions
    {
    公共静态MvcHtmlString CascadingDropDownListFor(
    这个HtmlHelper HtmlHelper,
    表情表情,
    IEnumerable selectList,
    字符串选项标签,
    我的辞典,
    字符串parentControlName,
    字符串childListUrl
    )
    {
    var memberName=GetMemberInfo(表达式).Member.Name;
    MvcHtmlString returnHtml=Html.SelectExtensions.DropDownListFor(htmlHelper、表达式、selectList、optionLabel、htmlAttributes);
    var returnString=MvcHtmlString.Create(returnHtml.ToString()+
    @"
    $(文档).ready(函数(){
    $(“”#“”).change(函数(){
    var postData={:$(“”#“”).val()};
    $.post(“”,postData,函数(数据){
    var期权=”;
    $.each(数据、函数(索引){
    选项+=“”+数据[索引]。名称+“”;
    });                                     
    $(“#”)html(选项);
    })                                 
    .error(函数(jqXHR,textStatus,errorshown){alert(jqXHR.responseText);});
    });                         
    });                      
    "
    .Replace(“,parentControlName)
    .Replace(“,childListUrl)
    .替换(“,成员名称”);
    返回字符串;
    }
    私有静态MemberExpression GetMemberInfo(表达式方法)
    {
    LambdaExpression lambda=作为LambdaExpression的方法;
    if(lambda==null)
    抛出新的ArgumentNullException(“方法”);
    MemberExpression memberExpr=null;
    if(lambda.Body.NodeType==ExpressionType.Convert)
    {
    memberExpr=((UnaryExpression)lambda.Body)。操作数作为MemberExpression;
    }
    else if(lambda.Body.NodeType==ExpressionType.MemberAccess)
    {
    memberExpr=lambda.Body作为MemberExpression;
    }
    if(memberExpr==null)
    抛出新的ArgumentException(“方法”);
    返回成员expr;
    }
    }
    }
    
    否则,如果有人知道在mvc3中实现级联下拉列表的一种更简单的方法,我会尝试一下,但是我已经看过了很多其他的搜索结果,这是我认为最容易实现的方法

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

    使用中的Ajax下拉菜单,您就不再需要编写javascript了

    使用

    System.Web.Mvc.Html.SelectExtensions.DropDownListFor(..);
    
    而不是

    using System.Web.WebPages.Html;
    

    我看了,但问题是要从整个项目中找出我需要的东西,包括很多,我现在再看一看,但是如果你认为我应该寻找的关键东西需要直接复制,比如特定的jscript或控制器代码,那么任何东西都会有帮助,谢谢。好的,我昨晚终于让它工作了,但它不喜欢复杂的对象引用,所以我不能在viewmodel中引用表记录的id,所以只需要创建一个int并将其用作对象,然后在控制器中对连接进行排序。另外,我不喜欢它拒绝接受edmx,并要求在linq到sql中使用dbml。