【问题标题】:Issue setting up Cascading drop downs in MVC在 MVC 中设置级联下拉菜单的问题
【发布时间】:2012-03-07 19:28:41
【问题描述】:

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

问题是:-

  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 中实现级联下拉列表的更简单的方法,我会尝试使用它,但我已经查看了一堆其他搜索结果,这就是我拥有的认为最容易实现。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我看过了,但问题在于从整个项目中找出我需要的东西,其中包括很多,我现在再看一下,但如果有任何关键的事情你我想我应该寻找需要直接复制的东西,比如特定的 jscript 或控制器代码,那么任何东西都会有帮助,谢谢。
    • 好吧,我昨晚终于让它工作了,但事实证明它不喜欢复杂的对象引用,所以我无法在视图模型中引用表记录的 id,所以只好创建一个 int 并将其用作对象,然后在控制器中对连接进行排序。另外我不喜欢它拒绝接受 edmx 并要求使用 dbml 的 linq to sql。
    【解决方案2】:

    使用

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

    而不是

    using System.Web.WebPages.Html;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 2012-07-21
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2011-03-03
      相关资源
      最近更新 更多