Я пытался реализовать код в ответе здесь
Проблемы: -
- Настройка или создание помощника
- интеграция помощника в представление для выполнения 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, я попробую это вместо этого, но я уже просмотрел кучу других результатов поиска для этого, и это был тот, который я решил, что проще всего воплощать в жизнь.
В любом случае любая помощь будет высоко оценена.