2016-02-18 54 views
1

我想從我的視圖傳回一個ViewBag項目回到該視圖的後期方法,但我有困難。asp.net mvc 5 - 將ViewBag項目傳遞迴控制器

這是我的方法的簡化版本:

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是我的玩家遊戲模式外鍵:的new { PlayerID = ViewBag.SelPlayerId }@Html.HiddenFor()方法

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

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

回答

1

您使用的是設置一個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) 
+0

工作完美,謝謝 – CianGallagher

0

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

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

此:

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

是創建一個隱藏的元素,綁定到model.PlayerID,但具有PlayerID的自定義Html屬性,您將獲得0,因爲這是int的默認值,並且您沒有將其設置在模型上。

根據您的(簡化)代碼示例,你應該能夠模型PlayerID設置爲您選擇的值在控制器上的取得動作:

newGame.PlayerID = selPlayer.PlayerID 

然後

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

如果由於某種原因您使用ViewBag,並且無法像上面那樣在模型上填充它,您可以將u SE @Html.Hidden,而不是保證值回來在

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

會導致:

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

這應該模擬綁定回模型。如果這不是一種選擇,而且手動操作更多,則可以將第一個參數更改爲「SelectedPlayerID」,然後您可以從控制器後操作中的Request中抽出。

相關問題