asp.net mvc 5 - 将ViewBag项目传回控制器

时间:2016-02-18 10:21:53

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我正在尝试将ViewBag项目从我的视图传回到该视图的post方法,但我遇到了困难。

这是我的方法的简化版本:

public ActionResult CreateGame(int id)
{
    var selPlayer = db.Players.Find(id);

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

    ViewBag.SelPlayerId = selPlayer.PlayerID;

    PlayerGame newGame = new PlayerGame ();

    return View(newGame);
}

[HttpPost]
public ActionResult CreateGame(PlayerGame newGame)
{
    newGame.GameTitle = newGame.GameTitle;
    newGame.GameNotes = newGame.GameNotes;
    newGame.PlayerID = newGame.PlayerID;

    return RedirectToAction("PlayerView");
    return View(newGame);
}

这是我的视图的简化版本:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        <fieldset>

            <div class="editor-label">
            @Html.LabelFor(model => model.GameTitle)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.GameTitle)
        </div>

            <div class="editor-label">
                @Html.LabelFor(model => model.GameNotes)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.GameNotes)
            </div>

            @Html.HiddenFor(model => model.PlayerID, new { PlayerID = ViewBag.SelPlayerId })
            <p>
                <input type="submit" value="Submit Game" class="btn btn-info" />
            </p>
        </fieldset>
        </div>
        }

在POST方法中你可以看到我试图将PlayerID设置为等于我作为ViewBag.SelPlayerID传递的玩家ID但是当我查看调试器中传递的值时,id总是等于0,这是不正确的,因为我用来测试的玩家的id为1。

我的问题是如何设置我正在创建的新游戏的玩家ID等于我作为ViewBag项目传递的玩家ID,或者如果有一种更容易的方法,我忽略了这一点。

注意:玩家ID是我的玩家游戏模型中的外键:

//Foreign Key for Player
        public int PlayerID { get; set; }

        [ForeignKey("PlayerID")]
        public virtual Player Player { get; set; }

3 个答案:

答案 0 :(得分:1)

您在new { PlayerID = ViewBag.SelPlayerId }方法中使用@Html.HiddenFor()是设置html属性,而不是属性的值。

如果你检查html你的生成它将是

<input type="hidden" name="PlayerID" PlayerID="1" value="0" />

更改您的GET方法以设置模型中属性的值(并删除ViewBag属性)

PlayerGame newGame = new PlayerGame() { PlayerID = selPlayer.PlayerID };
return View(newGame);

并在视图中使用

@Html.HiddenFor(m => m.PlayerID)

答案 1 :(得分:1)

此:

@Html.HiddenFor(model => model.PlayerID, new { PlayerID = ViewBag.SelPlayerId })

正在创建一个绑定到model.PlayerID的隐藏元素,但使用PlayerID的自定义Html属性,您获得0,因为它是int的默认值你没有把它放在模特身上。

根据您的(简化)代码示例,您应该能够在控制器上的get操作中将模型PlayerID设置为您选择的值:

newGame.PlayerID = selPlayer.PlayerID

然后

@Html.HiddenFor(m => m.PlayerID)

如果由于某种原因您 使用ViewBag,并且无法在上面的模型中填充它,则可以使用@Html.Hidden来确保值回来了。

@Html.Hidden("PlayerID", ViewBag.SelPlayerId)

将导致:

<input type="PlayerID" value="1" />

哪个模型应该绑定回模型。如果这不是一个选项并且手动更多,您可以将第一个参数更改为&#34; SelectedPlayerID&#34;然后你可以从控制器后期操作中的Request拉出来。

答案 2 :(得分:0)

只需使用viewbag尝试此操作。在cshtml视图页面中设置隐藏的类型元素。在回发中,您将在您的参数中获得您的玩家ID。如果您使用输入类型提交 < / p>

<input type="hidden" id="PlayerID" name="PlayerID" value="@ViewBag.SelPlayerId"/>