簡體   English   中英

asp.net mvc 5-將ViewBag項傳遞回控制器

[英]asp.net mvc 5 - Passing a ViewBag item back to the controller

我試圖將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設置為與我通過的玩家ID相同,作為ViewBag項,或者是否有一種更簡單的方法被我忽略了。

注意:玩家ID是我的玩家游戲模型中的外鍵:

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

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

您在@Html.HiddenFor()方法中使用new { PlayerID = ViewBag.SelPlayerId }正在設置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)

這個:

@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" />

哪個模型應綁定回模型。 如果這不是一個選擇,而是要手動進行,則可以將第一個參數更改為“ SelectedPlayerID”,然后可以在控制器后操作中從“ Request中退出。

只是試圖在CSHTML視圖page.On回傳此使用viewbag alone.Set隱藏式元素你會得到你的argument.This您的玩家ID將工作,如果你使用的是輸入型提交

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM