ここの回答にコードを実装しようとしています
問題は次のとおりです。
- ヘルパーの設定または作成
- ヘルパーをビューに統合して 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 でカスケード ドロップダウン リストを実装するより簡単な方法を誰かが知っている場合は、代わりにそれを試してみますが、すでに他の検索結果をたくさん見ていて、これが最も簡単だと考えたものでした。埋め込む。
とにかくどんな助けでも大歓迎です。