MVCビューはJQuery呼び出し後に更新されません
-
21-12-2019 - |
質問
私はMVC5webアプリケーションを構築しています。レイアウトテンプレートには、ユーザー名のリストを含むドロップダウンリストがあります。このドロップダウンはレイアウトテンプレート内にあるため、テンプレートから継承するすべてのビュー内でアクセスできます。
ユーザーがサイトにログインして認証に合格すると、コントローラーのIndexメソッドに送られます。このメソッドは、int型のnull許容IDを受け入れます。ユーザーがログインすると、Indexメソッドに渡されるidは常にnullになります。次に、ログインしたユーザー IDを取得し、クエリを実行して詳細を取得します(以下を参照)。
public ActionResult Index(int? id)
{
DashboardViewModel model = new DashboardViewModel();
if(id == null || id == 0)
{
User user = _userService.GetUserByID(Convert.ToInt32(User.Identity.GetUserId()));
model.SelectedUser = user;
}
else
{
model.SelectedUser = _userService.GetUserByID(id.Value);
}
return View(model);
}
私は彼らの詳細をViewModelに渡し、次にviewに渡して、メールアドレスをUIに書き込みます。
@model MyApp.UI.ViewModels.DashboardViewModel
<h1>@Model.SelectedUser.email</h1>
ユーザーがUIを表示したら、ドロップダウンリストから他のユーザーを選択できます。そうすると、選択したユーザーのメールアドレスがUI上のユーザーのメールアドレスに置き換わるはずです。
このプロセスは次のように機能します。ユーザーがドロップダウンリストから名前を選択すると、JQuery関数が呼び出されます
$(document).ready(function () {
$("#UserID").change(GetUser);
function GetUser() {
$.ajax({
type: "GET",
url: '/Dashboard/Index/',
data: { id: $(this).val() },
error: function () {
alert("An error occurred.");
},
success: function () {
alert("success");
}
});
}
});
この関数は、ドロップダウンリストからIDをコントローラのIndexメソッドに戻します。今回のIndexメソッドは、idがNULLではないことを認識し、そのidに基づいて選択したユーザーの詳細を取得するクエリを実行します(上記のIndexメソッドを参照)。
詳細は再びViewModelに入れられ、ビューに渡されます。ビューに渡されるモデルには、選択したユーザーの詳細が含まれており、ユーザーのメールアドレスをUIに書き込む必要があります
@model MyApp.UI.ViewModels.DashboardViewModel
<h1>@Model.SelectedUser.email</h1>
しかし、これが私の問題です。ドロップダウンリストから選択したユーザーに関係なく、すべてが期待どおりに機能するようにコードをステップ実行できますが、UIに書き込まれた
選択したユーザーの詳細がViewModelに渡されるのを見ることができるので、これは奇妙ですが、UIは電子メールアドレスを更新しません。
長い投稿のために謝罪しますが、私は成功せずに一日以上これに取り組んできたので、これを修正するために可能な限り詳細を与えたかったのです。
どんな助けでも本当に感謝されます。
ありがとう!.
解決
私が見る限り、あなたはあなたを使用していません $.ajax
どこでも結果を呼び出します。あなただけのアラートを表示し、それが行われています。Resultでデータを使用する必要がありますが、wholeを返すときは View
とだけではなく、 PartialView
おそらく、ドロップダウンを変更するだけでリダイレクトする方が良いでしょう:
$("#UserID").change(function()
window.location.href = "/Dashboard/Index/" + $(this).val();
);
また、以下を使用することもできます @Url.Action("Index", "Dashboard")
urlのハードコーディングを避けるため。