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;
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。