简体   繁体   English

@ Html.DropDownListFor和viewmodel不发回到控制器?

[英]@Html.DropDownListFor and viewmodel not posting back to controller?

It's time to ask the internet. 现在该问互联网了。 I'm a student and really new to MVC + coding in general, but I can't for the life of me figure out why this isn't working. 我是一个学生,真的是MVC +编码的新手,但是我无法终生弄清楚为什么它不起作用。 Probably something really obvious. 可能确实很明显。 :/ :/

I have a View ( AddMemberToGroup ) that is strongly-typed to a viewmodel ( PersonGroupingViewModel ). 我有一个视图( AddMemberToGroup ),它是强类型PersonGroupingViewModel viewmodel( PersonGroupingViewModel )的。 What am I trying to do is add a Person to a Group, with the user selecting a group from a dropdown list in the View. 我要执行的操作是将一个人添加到组中,用户从视图的下拉列表中选择一个组。

Viewmodel: 视图模型:

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; }

}

Controller: 控制器:

//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);
}

View form (strongly-typed to PersonGroupingViewModel): 视图表单(强类型为PersonGroupingViewModel):

Add Member To Group 将成员添加到组


@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>
}

When I click 'submit' in the browser I get back a URL: localhost:54696/People/AddMemberToGroup?PersonId=1 当我在浏览器中单击“提交”时,我得到一个URL: localhost:54696/People/AddMemberToGroup?PersonId=1

Along with exception "Object reference not set to an instance of an object" on the line Group group = db.Groups.Find(GroupId); Group group = db.Groups.Find(GroupId);行上有异常“对象引用未设置为对象的实例” Group group = db.Groups.Find(GroupId); in the controller. 在控制器中。

Is the viewmodel coming back empty or not at all? 视图模型返回为空还是根本不返回? I am not sure what is going on and would appreciate someone attempting explaining it in small words. 我不确定发生了什么,不胜感激有人尝试用小词来解释它。 I've done a lot of Googling and tried several suggestions from that but in the end I feel as though I'm going in circles. 我做了很多谷歌搜索,并从中尝试了一些建议,但最终,我感觉好像要转圈了。

Solved it... 解决了...

group.Members was null so group.Members.Add(person) didn't work. group.Members为空,因此group.Members.Add(person)无法正常工作。 Wrote in an if/else statement to instantiate a new member list if the list is null, and it works fine: 如果列表为空,则在if / else语句中编写以实例化新的成员列表,并且工作正常:

if (group.Members == null)
            {
                group.Members = new List<Person>();
                group.Members.Add(person);
            }
            else {
                group.Members.Add(person);
            }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM