お疲れ様です。
気が付けばもう9月ですね。
8月は自分が推しているIVEがカムバしました。
新曲もMV含めめっちゃいいです。
余談終わり。
ということで、
今回は業務で非同期通信でデータベースから取得した値をViewに反映させる処理を使用したので
そのことについて書きたいと思います。
asp.net mvc のviewには部分ビューというものが存在します。
今回はその部分ビューに取得したデータを渡し、部分ビューのみを更新してあげることにより
非同期で行うように実装しました。
@Html.Partial("~/Views/Test/IndexList.cshtml", @Model)
部分ビューの呼び出しは上記通りです。
第一引数に呼び出すビューのパス、第2引数にModelを渡しています。
この@Modelの中にはテーブルから取得した値が格納されており、部分ビューでそれを展開し、表示します。
jsファイル側の処理ですが、
$.ajax({
url: url,
type: 'post',
dataType: 'html',
data: {
sortType: sortType,
searchWord: word
}
}).done(function (result) {
$('.target-list').empty();
$('.target-list').html(result);
})
のようになっています。
urlにはアクション先のURLが指定されています。
dataにはソート順と検索キーワードを渡しています。
コントローラー側です
public ActionResult SortIndex(RequestTestModel req)
{
using (var context = new ApplicationDbContext())
{
List<TestModel> query = new List<TestModel>();
query = req.sortType == "asc" ? context.Tests.OrderBy(x => x.create_datetime).ToList() : context.Tests.OrderByDescending(x => x.create_datetime).ToList();
if (query.Count() == 0)
{
return View("IndexList");
}
return View("IndexList", query);
}
}
引数にdataの値が格納されておりその値を使用し、データを昇順か降順で取得するという処理を行っています。
return Viewには第一引数に部分ビューであるIndexListをしていし、第二引数にはqueryオブジェクトを指定します。
ここで注意しないとならないことは、return先はビューではなくjs側であることです。
ajax通信に成功すると戻り値はdone内の引数に格納されます。(今回の場合はresultに格納)
resultの中身はrequestする際にhtmlと指定しているのでhtmlが返ります。
今回は.targetList以下の要素を一度削除し、返ってきたhtmlを描画することで、非同期処理で値を更新しています。
正直、ajaxでせず、async awaitを使用したほうがいいと思いますが、一応残しておきます。
おしまい。