2017-02-16 12 views
15

同じ問題で多くの投稿を読んだことがありますが、何も助けませんので重複した質問にお詫び申し上げます:(IveはJQueryUIサイトの簡単なサンプルをハードコーディング値とオートコンプリートが、私は私のデータベースから来て、それを必要とするJQuery UIオートコンプリートがActionResultに到達しないC#MVC

ビュー:

@Html.TextBoxFor(model => model.Position, new { @type = "text", @id = "jobtitle", @name = "jobtitle", @placeholder = "Job Title" }) 

JS:

EDIT:私は成功した場合にアラートを追加し、アラートが呼び出されているが、そこ何もないa(すなわち、 DBから引っ張られているデータがありません)

<script> 
$(function() { 
      $("#jobtitle").autocomplete({ 
       source: function (request, response) { 
        $.ajax({ 
         url: '@Url.Action("JobsAutoFill", "Account")', 
         data: { 
          Prefix: request.term 
         }, 
         success: function (data) { 
          alert(data); 
          response(data); 
         } 
        }); 
       }, 
       minLength: 1 
      }); 

      //$("#jobtitle").autocomplete({ 
      // source: "/Account/JobsAutoFill/" 
      //}); 
     }); 
</script> 

そして、私は必要なリンクを追加していませ:

以下
<script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 

は、ジョブのリストをプルする(実際化するJsonResult)&機能私のActionResultです

public List<Jobs> GetAllJobs() 
    { 
     List<Jobs> JobsList = new List<Jobs>(); 

     using (RBotEntities EF = new RBotEntities()) 
     { 
      var JobsListQuery = (from ED in EF.EmploymentDetails 
            select new 
            { 
             ED.pkiEmploymentDetailID, 
             ED.Position 
            }); 

      foreach (var item in JobsListQuery) 
      { 
       JobsList.Add(new Jobs 
       { 
        Id = item.pkiEmploymentDetailID, 
        Name = item.Position 
       }); 
      } 
     } 

     return JobsList; 
    } 

public JsonResult JobsAutoFill(string Prefix) 
     { 
      //Note : you can bind same list from database 


      List<Jobs> ObjList = new List<Jobs>(); 

      ObjList = GetAllJobs(); 

      //Searching records from list using LINQ query 


      var JobNames = (from N in ObjList 
          where N.Name.StartsWith(Prefix) 
          select new { N.Name }); 
      return Json(JobNames, JsonRequestBehavior.AllowGet); 
     } 

何か不足しているか間違っていますか?

私は助けていただきありがとうございます!

+0

誰でも手伝っていただけますか? – AxleWack

+1

今はjqueryを無視してください。これはGETメソッドです。ウェブブラウザからアクセスしてください。それは動作しますか?ジョブはシリアライズ可能ですか?サーバー上のブレークポイントにヒットできますか?また、 "データ"オブジェクトの内部には何がありますか? data.Dataも試してみてください –

+0

今コントローラーに連絡してジョブが返されたことを確認できましたが、今は表示されません(テキストが表示されていない小さなボックスのポップアップしか表示されません)。私はdata.Dataを試して、それは未定義と言った。 – AxleWack

答えて

13

私はそれを動作させました!

問題を引き起こした最初のことは、[AllowAnonymous]を自分のActionResultの上に追加する必要があることでした。

第二に、私はこれに私のAjax呼び出しを変更:

$(function() { 
    $("#jobtitle").autocomplete({ 
     source: function (request, response) { 
      $.ajax({ 
       url: '@Url.Action("JobsAutoFill", "Account")', 
       data: { 
        Prefix: request.term 
       }, 
       success: function (data) { 
        response($.map(data, function (obj) { 
         return { 
          label: obj.Name, 
          value: obj.Name 
         }; 
        })); 
       } 
      }); 
     }, 
     minLength: 1 
    }); 
}); 

は以下の私のActionResultです。それは公共のアクセス権を持っていることを持っているdoesntの場合は、それがのAllowAnonymous行うべきではありません

[AllowAnonymous] 
public JsonResult JobsAutoFill(string Prefix) 
{ 
    //Note : you can bind same list from database 


    List<Jobs> ObjList = new List<Jobs>(); 

    ObjList = GetAllJobs(); 

    //Searching records from list using LINQ query 


    var JobNames = (from N in ObjList 
        where N.Name.ToLower().StartsWith(Prefix.ToLower()) 
        select new { N.Name }); 
    return Json(JobNames, JsonRequestBehavior.AllowGet); 
} 
3

:私は、大文字と小文字の区別を整理う変更を追加しました。 そして第二には、パフォーマンスを向上させるため、あなたのクエリを変更します。

var JobNames = (from N in ObjList 
       where N.Name.ToLower().StartsWith(Prefix.ToLower()) 
       select N.Name); 

は明らかに、文字列配列を返す必要があります。しかし、あなたのコードは、単一の文字列プロパティを持つオブジェクト配列を返しています。

と更新にacccordingスクリプトコードを変更:

success: function (data) { 
        response($.map(data, function (obj) { 
         return { 
          label: obj, 
          value: obj 
         }; 
        })); 
       } 
3

いけない変更は、クエリ文字列であなたのパラメータを渡すこれはあなたのバックエンド機能をヒットするような、あなたのAJAX呼び出しを変更匿名を許可します。これがあなたを助けることを望みます。

$(function() { 
$("#jobtitle").autocomplete({ 
    source: function (request, response) { 
     $.ajax({ 
      url: '@Url.Action("JobsAutoFill", "Account")?Prefix='+$("#jobtitle").val(), 
      data: { 
       Prefix: request.term 
      }, 
      success: function (data) { 
       response($.map(data, function (obj) { 
        return { 
         label: obj.Name, 
         value: obj.Name 
        }; 
       })); 
      } 
     }); 
    }, 
    minLength: 1 
}); 

});

関連する問題