だから私はいくつかのajaxを行う方法を持っています:
function prodChange() {
console.log(this.value);
// ajax
var url = '@Url.Action("GetAdvProdList", "Contract")' + '?prod_id=' + this.value;
$.ajax({
url: url,
type: 'GET',
success: showAdvProd,
error: function() {
console.log("FAILSHAKUREHKGAHH");
}
});
}
ajax は正常に戻り、このコントローラー メソッドを呼び出します。
public ActionResult GetAdvProdList(int prod_id) { // product id
// get advertising products for this product
OutlookMediaEntities1 db = new OutlookMediaEntities1();
var advsList = from printAdOption in db.print_ad_option
where printAdOption.print_product_id == prod_id
select printAdOption;
List<SelectListItem> adv_list = new List<SelectListItem>(); // list of ads
List<print_ad_option> advs = advsList.ToList(); // list from db
foreach (print_ad_option av in advs)
{
SelectListItem temp_item = new SelectListItem();
temp_item.Text = av.name;
temp_item.Value = av.print_ad_option_id.ToString();
adv_list.Add(temp_item);
}
ViewData["advproducts"] = new SelectList((IEnumerable<SelectListItem>)adv_list.ToList(), "Value", "Text");
return null;
}
View または PartialView を返すと機能しないため、null を返していますが、とにかくそれらを返したくないと思います。私が望むのは、ビューデータを設定することだけです。
ビューデータを使用するコードを追加する前は、ajax はうまく機能していました。残念ながら、ajax 成功メソッドで新しい ViewData を使用しようとすると、次のエラーが表示されます。ページをロードすると、showAdvProd 関数が呼び出される前に「@Html.DropDownListFor...」を評価しようとしているように見えます。
// called when the ajax returns a list of adv prods in a viewdata
function showAdvProd() {
// add drop down
$("#drdn1").append('@Html.DropDownListFor(m => m.print_ad_option_id, ViewData["advproducts"] as SelectList)');
}
(別の) ドロップダウン メニューからアイテムが選択されたときに ajax を実行する関数が呼び出されますが、このエラーではページが読み込まれないため、明らかに ajax 関数は呼び出されず、コントローラー メソッドも呼び出されません。もちろん、ビューデータは認識されません...
ビューデータを使用して ajax を使用せずに、フォームの別の部分に同様にドロップダウン メニューを作成していますが、正常に動作します。したがって、ビューデータの使用方法ではなく、ajaxまたはコントローラーメソッドに問題があると思います。
助けてくれてありがとう!