我正在尝试将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; }
答案 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"/>