【发布时间】:2012-03-07 19:28:41
【问题描述】:
我一直在尝试实现答案here中的代码
问题是:-
- 设置或创建助手
- 将助手集成到视图中以执行 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