2017-07-13 7 views
0

ここでは、国のドロップダウンの変化に基づいて状態テーブルからデータを取得しようとしています。内部サーバーエラーが発生しています。 IDはコントローラメソッドに渡されていますが、データは返されません。 ここに私のコードは次のとおりです。 ビューコード:変更jqueryメソッドでドロップダウンデータが変更されない

<div class="form-row"> 
        <div class="col-md-3">Country:</div> 
        <div class="col-md-9"> 


         @Html.DropDownListFor(model => model.CountryId, new SelectList(Model.Country, "Id", "Name"), "-- Select Country --", new { @class = "validate[required,maxSize[100]] select select2insidemodal",@id="country", @onchange = "FillState()" }) 
        </div> 
       </div> 
       <div class="form-row"> 
        <div class="col-md-3">State:</div> 
        <div class="col-md-9"> 


         @Html.DropDownListFor(m => m.State, 
    new SelectList(Enumerable.Empty<SelectListItem>(), "StateId", "Name"), 
      "Select State", 
      new { @class = "form-control" }) 

        </div> 
       </div> 

スクリプトコード:

function FillState() { 
     var countryId = $('#country').val(); 
     console.log(countryId); 
     $.ajax({ 
      url: '/PM/Company/FillState'+'/'+countryId, 
      method: "GET", 
      //dataType: "JSON", 
      success: function (states) { 
       console.log(states); 

       $("#State").html(""); // clear before appending new list 
       $.each(states, function (i, state) { 
        $("#State").append(
         $('<option></option>').val(state.StateId).html(state.Name)); 
       }); 
      } 
     }); 
    } 

コントローラメソッドFillState

public ActionResult FillState(int id) 
    { 
     var states = _stateService.GetStates(id); 
     return Json(states,JsonRequestBehavior.AllowGet); 

    } 

状態サービスが値を返しているが、リターンJSONを返すされていません任意のものと私はコンソール上で内部サーバーエラーを取得します。 xhrでajaxリクエストが表示されると、そのリクエストの詳細を開いたときに次のエラーが表示されます。 '/'アプリケーションでサーバーエラーが発生しました。タイプ のオブジェクトをシリアル化しながら

循環参照が検出された「System.Data.Entity.DynamicProxies.State_6630E5941FBD9204A46907DE2F85C16BCADAC553D22FB81D0F45AD891174D200」。

この点について私を助けてください。そのための方法以下

+0

これを試してください:$( "#状態")追加(「<オプション値を。 = '" + state.StateID +"'> "+ state.Name +" "); }); –

+0

オブジェクト階層にJSONシリアライザでサポートされていない循環参照があるようです。すべての列が必要ですか?あなたがビューに必要なプロパティのみを拾うことができます: リターンJSON(新しい { PropertyINeed1 = data.PropertyINeed1、 PropertyINeed2 = data.PropertyINeed2 }); これにより、JSONオブジェクトの軽量化と理解が容易になります。多くのプロパティがある場合、AutoMapperを使用してDTOオブジェクトとViewオブジェクトを自動的にマッピングできます。 – Dilip

+0

あなたは私の文脈で上記のdata.propertyを教えていただけますか?私はautomapperを使用しています。国家と国がマッピングされています – Muhammad

答えて

0

用途:

public JsonResult FillState(int? CountryId) 
{ 
    var states = _stateService.GetStates().Where(p => p.countryId == CountryId).ToList(); 
    return Json(new SelectList(states.ToArray(), "StateId", "Name"), JsonRequestBehavior.AllowGet); 
} 

そして、あなたのAjaxの成功機能:

$.each(states, function (i, state) { 
        $("#State").append("<option value='" + state.StateId + "'>" + state.Name + "</option>"); }); 
       }); 
+0

'IEnumerable 'new SelectList(..) 'を使用して最初のものから2番目のものを作成することはさらに無意味です –

+0

今すぐ最新の変更で更新されました。 –

+1

** IEnumerable を返しません**! –

関連する問題