2013-05-14 37 views
3

我在使用http post窗體提交時在模型中丟失一個值時出現問題。模型中的一個變量在http post後變爲空

控制器方法:

[HttpGet] 
public ActionResult AddTeam(int id) 
{ 
    return PartialView("_AddTeam", ViewModelGenerator.TeamFormModel(id)); 
} 

[HttpPost] 
public ActionResult AddTeam(TeamFormModel model) 
{ 
    TournamentTeamService.CreateTeam(model); 

    return RedirectToAction("Index", "Tournament", null); 
} 

形式模型:

public class TeamFormModel 
{ 
    public TeamViewModel Team { get; set; } 
    public TournamentViewModel Tournament { get; set; } 
    public List<PlayerViewModel> Players { get; set; } 
} 

這個功能是從控制器調用,它會創建表單模型的新實例,並從數據庫中獲取的比賽並將其放入視圖模型中

public static TeamFormModel TeamFormModel(int id) 
{ 
    var _db = new DbContext(); 
    var model = new TeamFormModel(); 
    var tempModel = new TournamentViewModel(); 

    var temp = (from t in _db.tournament 
         where t.Id == id 
         select t).SingleOrDefault(); 

    tempModel.Id = temp.Id; 
    tempModel.Name = temp.Name; 
    tempModel.SignupStartDate = temp.SignupStartDate; 
    tempModel.SignupEndDate = temp.SignupEndDate; 
    tempModel.StartDate = temp.StartDate; 
    tempModel.EndDate = temp.EndDate; 
    tempModel.Description = temp.description; 
    tempModel.TournamentType = temp.TournamentType; 

    model.Players = new List<PlayerViewModel>(); 
    model.Tournament = tempModel; 

    return model; 
} 

下面是視圖,代碼與th玩家列表的e個輸入缺失,這是因爲它通過jquery追加到player-forms div中,並且它完美地工作,所以在這種情況下我沒有考慮它。

@model Context.ViewModels.TeamFormModel 

<script src="~/Scripts/jquery-1.8.2.min.js"></script> 
<script src="~/Scripts/jquery.validate.min.js"></script> 
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> 

@using (Html.BeginForm("AddTeam", "Tournament", FormMethod.Post, new { enctype = "multipart/form-data", @class = "form-horizontal" })) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 
    <h2>Registering a team to @Model.Tournament.Name </h2> 
    <div class="control-group"> 
     @Html.LabelFor(model => model.Team.Name) 
     <div class="control"> 
      @Html.EditorFor(model => model.Team.Name) 
     </div> 
     <a class="add-player-form" href="javascript:void(0)">Add a player</a> 
     <div id="player-forms"> 

     </div> 
    </div>  
    <div class="control-group"> 
     <div class="control" style="clear: both;"> 
      <input type="submit" value="Register" /> 
     </div> 
    </div> 
} 

之前,我提交這種形式下,TeamFormModel是完全成立,被插入所有的值,我只需要知道的一切保存到數據庫中。但是,當它返回到控制器時,TeamFormModel中的聯賽變量爲空。所以當我將它發送到一個函數,它將其更改爲Db模型並將其提交給db時,每次都會失敗。

我知道有些方法可以解決問題,比如只保留錦標賽的ID而不是整個模型,然後在提交表單後從數據庫中獲取它,但是它確實讓我誤以爲它的行爲如此。

我在這裏沒有找到關於這個特定問題的任何東西在stackoverflow,有幾個類似的問題,但沒有任何表現自己的方式相同。

+0

是比賽id集? –

+0

是的,發佈後不會改變。 – grimurd

+0

哪裏有控件來繼承錦標賽對象? –

回答

3

你必須設置這樣的事情

@Html.HiddenFor(x => x.TournmentID); 

一些有權保留已傳給而視圖渲染視圖模型的價值,這將傳遞值回上後控制器

+0

Dave A在之前的評論中指出了這一點。因爲我不能標記他,所以將其標記爲答案。感謝您的幫助。 – grimurd