1

インターネットに問いかける時が来ました。私は学生で、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);コントローラーの行に「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という例外があります。

ビューモデルは空に戻ってきますか、それともまったくありませんか? 何が起こっているのかわからないので、誰かがそれを短い言葉で説明しようとしてくれれば幸いです. 私は多くのグーグルを行い、そこからいくつかの提案を試みましたが、最終的にはまるで輪になっているかのように感じます.

4

1 に答える 1

0

解決した...

group.Members が null だったため、group.Members.Add(person) が機能しませんでした。リストが null の場合に新しいメンバー リストをインスタンス化する if/else ステートメントを作成すると、正常に動作します。

if (group.Members == null)
            {
                group.Members = new List<Person>();
                group.Members.Add(person);
            }
            else {
                group.Members.Add(person);
            }
于 2015-10-28T19:18:30.530 に答える