インターネットに問いかける時が来ました。私は学生で、MVC + コーディング全般に本当に慣れていませんが、これが機能しない理由を一生理解できません。おそらく本当に明白な何か。:/
AddMemberToGroup
ビューモデル ( )に厳密に型指定されたビュー ( ) がありPersonGroupingViewModel
ます。私がやろうとしているのは、ユーザーがビューのドロップダウンリストからグループを選択して、グループに人を追加することです。
ビューモデル:
public class PersonGroupingViewModel
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set;}
public List<Group> Memberships { get; set; }
public SelectList AllGroups { get; set; }
public int SelectedGroupId { get; set; }
}
コントローラ:
//GET People/AddToGroup
public ActionResult AddMemberToGroup(int? PersonId)
{
if (PersonId == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Person person = db.People.Find(PersonId);
if (person == null)
{
return HttpNotFound();
}
SelectList allthegroups = new SelectList(db.Groups, "GroupId", "Name");
PersonGroupingViewModel viewmodel = new PersonGroupingViewModel();
viewmodel.PersonId = person.PersonId;
viewmodel.FirstName = person.FirstName;
viewmodel.LastName = person.LastName;
viewmodel.AllGroups = allthegroups;
//viewmodel.Memberships cannot be empty
if (person.Memberships == null)
{
viewmodel.Memberships = new List<Group>();
}
else
{
viewmodel.Memberships = person.Memberships.ToList();
}
return View(viewmodel);
}
//POST: People/AddToGroup
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddMemberToGroup(PersonGroupingViewModel vm)
{
SelectList allthegroups = new SelectList(db.Groups, "GroupId", "Name");
vm.AllGroups = allthegroups;
int PersonId = vm.PersonId;
int GroupId = vm.SelectedGroupId;
Person person = db.People.Find(PersonId);
Group group = db.Groups.Find(GroupId);
group.Members.Add(person);
db.SaveChanges();
return View(vm);
}
ビュー フォーム (PersonGroupingViewModel に厳密に型指定):
メンバーをグループに追加
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div>
<h4>Groups @Html.DisplayFor(model => model.FirstName) is already in:</h4>
<ul>
@foreach (var group in Model.Memberships)
{
<li>@Html.DisplayFor(modelItem => group.Name)</li>
}
</ul>
</div>
<div class="form-horizontal">
<h4>Add @Html.DisplayFor(model => model.FirstName) @Html.DisplayFor(model => model.LastName) To Group:</h4>
@Html.HiddenFor(model => model.PersonId)
<div class="form-group">
<label>Group: </label>
@Html.DropDownListFor(m => m.SelectedGroupId, Model.AllGroups, String.Empty)
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Add To Group" class="btn btn-default" />
</div>
</div>
</div>
}
ブラウザで「送信」をクリックすると、次の URL が返されます。
localhost:54696/People/AddMemberToGroup?PersonId=1
Group group = db.Groups.Find(GroupId);
コントローラーの行に「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という例外があります。
ビューモデルは空に戻ってきますか、それともまったくありませんか? 何が起こっているのかわからないので、誰かがそれを短い言葉で説明しようとしてくれれば幸いです. 私は多くのグーグルを行い、そこからいくつかの提案を試みましたが、最終的にはまるで輪になっているかのように感じます.