2016-04-13 12 views
1

javascript関数UpdateFields()で 'c'オブジェクトのメンバーの値が常に '未定義'になるのはなぜですか?

コントローラーlistCitiesにjson returnをトラップすると、私は期待していた値を持っています。 listCitiesは戻り時に正しく設定されます。

CityModel.cs

namespace AutoCompleteInMVCJson.Models 
{ 
    public class CityModel 
    { 
     public int Id { get; set; } 
     public string City { get; set; } 
     public string State { get; set; } 
     public string Zip { get; set; } 
    } 
} 

HomeController.cs

namespace AutoCompleteInMVCJson.Controllers 
{ 
    public class HomeController : Controller 
    { 

     [HttpGet] 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public JsonResult Index(string s) 
     { 

      List<CityModel> cities = new List<CityModel>() 
      { 
       new CityModel {Id=1, City="Cincinnati", State="Ohio", Zip="c-oh" }, 
       new CityModel {Id=2, City="Miami", State="Florida", Zip="33114" }, 
       new CityModel {Id=3, City="Miami", State="Florida", Zip="33125" }, 
       new CityModel {Id=4, City="Atlanta", State="Georgia", Zip="a-ga" }, 
       new CityModel {Id=5, City="Chicago", State="Illinois", Zip="c-il"}, 
       new CityModel {Id=6, City="Seattle", State="Washington", Zip="s-wa"}, 
       new CityModel {Id=7, City="Culabra", State="Puerto Rico", Zip="c-pr" }, 
       new CityModel {Id=8, City="Key West", State="Flordia", Zip="kw-fl" } 
      }; 

      var listCities = (
        from c in cities 
        where c.City.ToUpper().Contains(s.ToUpper()) 
        select new { c.Id, c.City, c.State, c.Zip } 
       ); 
      return Json(listCities, JsonRequestBehavior.AllowGet); 
     } 
    } 
} 

あなたは私は何を得ることができる場合index.cshtml @model AutoCompleteInMVCJson.Models.CityModel

@{ 
    ViewBag.Title = ""; 
} 
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css"> 
<script src="//code.jquery.com/jquery-1.10.2.js"></script> 
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#City").autocomplete({ 
      source: function (request, response) { 
       $.ajax({ 
        url: "/Home/Index", 
        type: "POST", 
        dataType: "json", 
        data: { s: request.term }, 
        success: function (lst) { 
         response($.map(lst, function (c) { 
          return { label: c.Id + "//" + c.City + "//" + c.State + "//" + c.Zip, value: c.City }; 
         })) 
        } 
       }) 
      }, 
      messages: { noResults: "", results: function() { return (""); } } 
     }); 
    }) 
</script> 



@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    <div class="form-horizontal"> 
     <hr /> 
     <div class="form-group"> 
      <div class="col-md-12"> 
       @Html.TextBoxFor(m => m.Id, new { @class = "hidden" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-12"> 
       @Html.TextBoxFor(m => m.City, new { @class = "form-control" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-12"> 
       @Html.TextBox("State") 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-12"> 
       @Html.TextBox("Zip") 
      </div> 
     </div> 
    </div> 
} 


<script type="text/javascript"> 
    var x = document.getElementById('City'); 

    x.addEventListener("blur", UpDateFields, true); 

    function UpDateFields() { 
     $.ajax({ 
      url: "/Home/Index" 
      , type: 'post' 
      , data: { s: $('#City').val() } 
      , success: function (c) { 
       $('#Id').val(c.Id); 
       $('#State').val(c.State); 
       $('#Zip').val(c.Zip); 
       alert("//" + c.Id.val() + "//" + c.City + "//" + c.State + "//" + c.Zip + "//") 
      } 
     }); 
    } 
</script> 

ここでやろうと努力し、より良い方法で私はすべての耳にそれらを行うためにthougnts持っている。

ありがとうございました。

答えて

3

linqクエリは、一致するアイテムが1つしかない場合でも、常にリストを返すようになります。

2つのajax呼び出しを/ Home/Indexに設定します。あなたが正しく返されたJSONリストを扱う最初のケースでは:第2のケースで

success: function (lst) { 
         response($.map(lst, function (c) { 
          return { label: c.Id + "//" + c.City + "//" + c.State + "//" + c.Zip, value: c.City }; 
         })) 
        } 

あなたが戻ってくるものではありません、単一のJSONオブジェクトを、期待しています。

success: function (c) { 
       $('#Id').val(c.Id); 
       $('#State').val(c.State); 
       $('#Zip').val(c.Zip); 
       alert("//" + c.Id.val() + "//" + c.City + "//" + c.State + "//" + c.Zip + "//") 
      } 

2番目のケースでもリストを処理する必要があります。

メモ:POSTを使用して読み取り専用操作を処理するのはなぜですか?

+0

返信いただきありがとうございます。返すレコードが1つしかないときに単一オブジェクトを取得するのは本当ですか?私が1つ以上のMiamisを持っているところでは、33125以外の33114をIndex()への呼び出しでどのように指定すればよいのでしょうか?投稿/取得/何でも。私はそれが働いているので、これを改善し続けるつもりですので、私はできるだけ投稿から変更していきます。しかし、JsonResultとActionResultの間のIndex()ビューへの呼び出しをGet&Postで指定する方法はありますか? – Steve

+0

あなたが正しいです。私はJsonResult()を打ち破らなくてはなりません。 return()をこの行に変更すると、その点が証明されました。 Json(listCities.First()、JsonRequestBehavior.AllowGet)を返します。 2番目の呼び出しで郵便番号33114-v-33125を指定する方法についての提案がありますか?これを行うためのより良い方法がありますか? – Steve

+0

別の質問を投稿してみます。 –

関連する問題