简体   繁体   中英

asp.net mvc5 - Passing selected list item ids back to controller

I have a view model containing the information that I am using for a drop-down list on a view:

public class AddPlayersToGame
{
    public string GameTitle { set; get; }
    public int GameID { set; get; }
    public List<SelectListItem> Players { set; get; }
    public int PlayerID { get; set; }
    public int[] SelectedPlayers { set; get; }
}

This is my View which simply displays a drop-down list containing the list of Players to select from:

@model WebGameProj.ViewModels.AddPlayersToGame
<div>
{
    @Html.DropDownListFor(x => Model.PlayerID, Model.Players)

    <input type="submit" />
}
</div>

This is the controller methods I am using:

public ActionResult AddPlayersView(int id)
{
    var GameSelected = db.Games.Find(id);

    if (GameSelected== null)
    {
        return HttpNotFound();
    }

    var np = new AddPlayersToGame { GameID = id, GameTitle = GameSelected.GameTitle };

    np.Players = db.Players.Select(m => new SelectListItem
    {
        Text = m.PlayerUserName,
        Value = m.PlayerId.ToString()
    }).ToList();

    return View(np);
}

[HttpPost]
public ActionResult AddPlayersView(AddPlayersToGame model)
{
    foreach (var item in model.SelectedPlayers)
    {
        var SelPlayer = db.Players.Find(model.PlayerID);

        if (SelPlayer== null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        if (SelPlayer != null)
        {
            Game GameSelected = new Game();
            GameSelected.GamePlayers.Add(SelPlayer);

            db.Entry(GameSelected).State = EntityState.Modified;
            db.SaveChanges();
        }
    }
    return RedirectToAction("GameDetailsView");
}

So, basically I want to have a view that displays a drop-down list of players and when some players are selected the post method will then find each player on the database by using their ids that are being passed back via the drop-down list on the view, then add them to a the current list of players for that game.

Change your model to

public class AddPlayersToGame
{
    public string GameTitle { set; get; }
    public int GameID { set; get; }
    public int PlayerID { get; set; }
    public int[] PlayerIds { set; get; }
    public List<SelectListItem> Players { set; get; }
}

And your view to

@model WebGameProj.ViewModels.AddPlayersToGame
<div>
{
    @Html.ListBoxFor(x => x.PlayerIds, Model.Players)

    <input type="submit" />
}
</div>

You should then have the selects ids in the model after submitting.

You can also try:

Model

public class AddPlayersToGame
{
    public string GameTitle { set; get; }
    public int GameID { set; get; }
    public int[] PlayerIDs { get; set; }
    public MultiSelectList Players { get; set; }
}

Controller

public ActionResult AddPlayersView(int id)
{
    var GameSelected = db.Games.Find(id);

    if (GameSelected== null)
    {
        return HttpNotFound();
    }

    var np = new AddPlayersToGame { GameID = id, GameTitle =  GameSelected.GameTitle };

    var playerList = db.Players.Select(m => new
    {
        PlayerUserName = m.PlayerUserName,
        PlayerId = m.PlayerId
    }).ToList();

    np.Players = new MultiSelectList(playerList, "PlayerIDs", "PlayerUserName");
    return View(np);
}

[HttpPost]
public ActionResult AddPlayersView(AddPlayersToGame model)
{
    foreach (var playerID in model.PlayerIDs)
    {
        var SelPlayer = db.Players.Find(playerID);

        if (SelPlayer== null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        if (SelPlayer != null)
        {
            Game GameSelected = new Game();
            GameSelected.GamePlayers.Add(SelPlayer);

            db.Entry(GameSelected).State = EntityState.Modified;
            db.SaveChanges();
        }
    }
    return RedirectToAction("GameDetailsView");
}

View

@model WebGameProj.ViewModels.AddPlayersToGame

<div>
{
    @Html.ListBoxFor(x => x.PlayerIDs, Model.Players)
    <input type="submit" />
}
</div>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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