2016-07-31 6 views
0

私は実際のアイデアがあるように感じますが、アプリケーションをビルドするときに "オブジェクト参照がオブジェクトのインスタンスに設定されていません"というエラーが発生します。私は単に州の選択が行われた後に都市のドロップダウンリストを表示しようとしています。私はフォームのドロップダウンリストに使用している別のクラスの州のリストを持っています。私がしようとしているのは、選択された州を取得し、それを別のクラスに渡して、別のドロップダウンとして表示される都市の正しいリストを選択することです。したがって、誰かがワシントン州を選択すると、シアトルやタコマなどの都市が表示され、異なる州の都市は表示されません。ここでは、ドロップダウンのためのかみそりは、(状態が正常に動作します)です:After状態が選択された後に表示する都市リストの取得ASP MVC5

<div class="form-group"> 
      @Html.LabelFor(model => model.State, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(model => model.State, WebGridProject.Models.StateCodes.GetStatesList(), new { @class = "form-control" }) 
       @Html.ValidationMessageFor(model => model.State, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.City, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(model => model.City, WebGridProject.Models.CityNames.GetStateCities(Model.State), new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.City, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

そして、ここでは、都市のためのクラスです:

public class CityNames 
    { 
     public static IEnumerable<SelectListItem> GetStateCities(string stateName) 
     { 

      IList<SelectListItem> cities = new List<SelectListItem>(); 

      switch (stateName) 
      { 
       case "AK": 
        cities = new List<SelectListItem> 
        { 
         new SelectListItem() {Text = "", Value = ""}, 
         new SelectListItem() {Text = "Anchorage", Value = "Anchorage"}, 
         new SelectListItem() {Text = "Fairbanks", Value = "Fairbanks"}, 
        }; 
        break; 
       case "AL": 
        cities = new List<SelectListItem> 
        { 
         new SelectListItem() {Text = "", Value = ""}, 
         new SelectListItem() {Text = "Auburn", Value = "Auburn"}, 
         new SelectListItem() {Text = "Birmingham", Value = "Birmingham"}, 
         new SelectListItem() {Text = "Dothan", Value = "Dothan"}, 
         new SelectListItem() {Text = "Mobile", Value = "Mobile"}, 
        }; 
        break; 
       case "AZ": 
        cities = new List<SelectListItem> 
        { 
         new SelectListItem() {Text = "", Value = ""}, 
         new SelectListItem() {Text = "Pheonix", Value = "Pheonix"}, 
         new SelectListItem() {Text = "Flagstaff", Value = "Flagstaff"}, 
         new SelectListItem() {Text = "Prescott", Value = "Prescott"}, 
         new SelectListItem() {Text = "Tucson", Value = "Tucson"}, 
        }; 
        break; 
       case "AR": 
        cities = new List<SelectListItem> 
        { 
         new SelectListItem() {Text = "", Value = ""}, 
         new SelectListItem() {Text = "Fayetteville", Value = "Fayetteville"}, 
         new SelectListItem() {Text = "Fort smith", Value = "Fort smith"}, 
         new SelectListItem() {Text = "Jonesboro", Value = "Jonesboro"}, 
         new SelectListItem() {Text = "Texarkana", Value = "Texarkana"}, 
        }; 
        break; 
       default: 
        cities = new List<SelectListItem> 
        { 
         new SelectListItem() {Text = "", Value = ""}, 
         new SelectListItem() {Text = "Please Select State", Value = "Please Select State"}, 
        }; 
        break; 
      } 
      return cities; 
     } 
    } 

私にエラーがデフォルトになっていなけれを指しているように見えましたヌル値のロードに問題があります。しかし、この問題をカバーするためにswitch文にデフォルトのケースがあります。私はMVCにはかなり新しいので、私はこれを自分自身で続けます。しかし、誰かが何らかのアイデアを持っていれば、私はこれを理解するのに苦労しているので、私はすべての耳です。ちょうどFYI、州クラスはIList <>であり、州名のリストを返します。掲示されるアクションのための

要求:

public ActionResult MyHomePage() 
     { 
      return View(); 
     } 
     //Post method 
     [HttpPost] 
     public ActionResult MyHomePage(WebGridTable TWG) 
     { 
      try 
      { 
       if (ModelState.IsValid) 
       { 
        UserManager UM = new UserManager(); 
        UM.addNewUser(TWG); 
        ModelState.Clear(); 
        return View(); 
       } 
       return View(); 
      } 
      catch (Exception e) 
      { 
       return View("Error"); 
      } 
     } 

アクションのdoesntは本当に私は、フォームを管理するために書いた方法でなくて何の意味:

public void addNewUser(WebGridTable AddNew) 
     { 
      using (WebGridDBEntities4 db = new WebGridDBEntities4()) 
      { 
       WebGridTable TWG = new WebGridTable(); 
       TWG.Name = AddNew.Name; 
       TWG.DOB = AddNew.DOB; 
       TWG.AddressLine1 = AddNew.AddressLine1; 

       // TO DO: Figure out issue with accepting null value into database. 
       if (AddNew.AddressLine2 != null) 
       { 
        TWG.AddressLine2 = AddNew.AddressLine2; 
       } 
       else if (AddNew.AddressLine2 == null) 
       { 
        TWG.AddressLine2 = 0; 
       } 

       TWG.State = AddNew.State; 
       TWG.City = TWG.City; 
       TWG.Zip = AddNew.Zip; 
       TWG.Gender = AddNew.Gender; 

       db.WebGridTables.Add(TWG); 
       db.SaveChanges(); 
      } 
     } 
+0

あなたはアクションを投稿できますか? –

+0

完了。興味を持っていただきありがとうございます。 – Devoneous

+0

カスケーディングドロップダウンリストの実装方法を理解するには[this DotNetFiddle](https://dotnetfiddle.net/1bPZym)を参照してください。 –

答えて

1

あなたはの変化に関するjQueryのアクションを使用する必要があります状態DropDownList。コントローラ内の特定のアクションに値を送信し、そのState.GetStatesName( 'Value')を呼び出します。以下のコードを確認してください。私はそれが助けると思う。

$("#State").on('change',function() { 
    var loadingoption = $('<option></option>').text("Pleas Wait"); 
    $('#city').attr("disabled","disabled").empty().append(loadingoption); 

    jQuery.getJSON("/Home/CityJson/" + $("#State > option:selected").attr("value"), function (data) { 
     var defaultoption = $('<option value="">Please choose a City</option>'); 
     $('#city').removeAttr("disabled").empty().append(defaultoption); 
     jQuery.each(data, function (i) { 
      var option2 = $('<option></option>').attr("value", data[i].Name).text(data[i].Name); 
      $("#city").append(option2); 
     }); 
    }); 
}); 

私はHomeControllerでActionResult "CityJson"を使用しました。したがって、getJSONであなたのアクションを選択してください。ここで

はコントローラーです:

public ActionResult CityJson(string id) 
    { 
     var state = db.States.FirstOrDefault(x => x.Name == id); 
     var model = db.Cities.Where(x => x.StateId == state.Id).Select(x => new { x.Name }).ToList(); 
     return Json(model, JsonRequestBehavior.AllowGet); 
    } 

あなたは、クラス内のあなたの行動を呼び出し、JSONを使用してそれらを送信することができます。

Good Luck。

+0

ここであなたが何をしているのか理解していると思います。だから、javascriptはcshtmlファイルで使用されていますか? – Devoneous

+0

はい。これは、選択した状態の値を自分のアクションに渡すために使用されました。次に、アクションから受け取ったデータを使用してCity DropDown – MRebati

+0

を入力してください。私が本当に理解できない唯一のことは、(

関連する問題