2012-03-07 48 views
1

我一直在努力实现的答案代码here问题设置级联下拉菜单中MVC

的问题是: -

  1. 设置或创建帮手
  2. 整合帮手到查看来执行CascadingDropDropListFor

在第1天,我尝试为助手创建一个新类,然后我将代码移到了现有的页面模型中,但是发现如果我这样做,它解决了问题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' 不会在当前存在背景

B UT造成

'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

http://awesome.codeplex.com使用AjaxDropdown,你会不会需要写javascript了

+0

我看着这一点,但这个问题存在与发现从整个项目中我将需要的东西,包括很多,我现在再看看它,但如果有什么关键的东西,你认为我应该寻找需要复制的东西直接穿过像特定的jscript或控制器代码那么任何事情都会有所帮助,谢谢。 – Myzifer 2012-03-08 09:12:54

+0

好吧我终于得到它昨晚的工作,但事实证明,它不喜欢复杂的对象引用,所以我不能引用视图模型中的表记录的ID,所以只需要一个int并使用它作为该对象然后在控制器中排序连接。另外我不喜欢它拒绝接受edmx的,并要求使用dbml的linq to sql。 – Myzifer 2012-03-09 15:10:46

1

使用

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

,而不是

using System.Web.WebPages.Html;