私はいくつかの ajax をいじっていて、非常に奇妙で、私には非論理的なバグを経験しました。
フォームにラップされたイベントのリストをテーブルに表示しています。各イベントには一意の ID (EventID) があります。これは、ボタンが押されたときにアクションに送信されます。テーブルを囲む div が、アクションが返した部分ビューで更新されるようになりました。
問題
ビューがリロードされると、フィールド EventID を含むすべての HiddenFields が、同じ EventID を含むようになりました。アクションに提出されたもの
ビューにブレークポイントを配置して、HiddenField にどのような値が設定されているかを確認してみました。ここでは、正しい ID が実際にフィールドに設定されていることがわかります。ただし、ページが更新されると、すべての隠しフィールドには、最初にアクションに送信されたものと同じイベント ID が含まれます。
部分ビュー: _Events
@model SeedSimple.Models.ViewModelTest
<table class="table table-striped table-bordered table-condensed">
@foreach (var item in Model.events)
{
@using (Ajax.BeginForm("AddAttendantToEvent", "MadklubEvents", new AjaxOptions()
{
HttpMethod = "post",
UpdateTargetId = "tableevents"
}))
{
@Html.Hidden("EventID", item.MadklubEventID);
<input type="submit" value="Join!" id="join" class="btn" />
}
@using (Ajax.BeginForm("RemoveAttendantFromEvent", "MadklubEvents", new AjaxOptions()
{
HttpMethod = "post",
UpdateTargetId = "tableevents"
}))
{
@Html.Hidden("EventID", item.MadklubEventID);
<input type="submit" value="Leave" class="btn" />
}
}
</table>
AddAttendantToEvent アクション:
[HttpPost]
[Authorize]
public ActionResult AddAttendantToEvent(int EventID)
{
if (ModelState.IsValid)
{
var uow = new RsvpUnitofWork();
var currentUser = WebSecurity.CurrentUserName;
var Event = uow.EventRepo.Find(EventID);
var user = uow.UserRepo.All.SingleOrDefault(u => u.Profile.UserName.Equals(currentUser));
user.Events.Add(Event);
Event.Attendants.Add(user);
uow.Save();
ViewModelTest viewmodel = new ViewModelTest();
viewmodel.events = madklubeventRepository.AllIncluding(madklubevent => madklubevent.Attendants).Take(10);
viewmodel.users = kitchenuserRepository.All;
return PartialView("_Events", viewmodel);
}
else
{
return View();
}
}
EventID 4 をアクションに送信した後のすべての入力フィールドの外観
<input id="EventID" name="EventID" type="hidden" value="4">
これは、私が知らない ajax 呼び出しの副作用によるものだと思います。この件に関する啓蒙は大歓迎です:)