CianGallagher
CianGallagher

Reputation: 45

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.

Upvotes: 0

Views: 1868

Answers (2)

JimmyBytes
JimmyBytes

Reputation: 57

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>

Upvotes: 0

McNultyyy
McNultyyy

Reputation: 1032

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.

Upvotes: 1

Related Questions