【发布时间】:2013-05-14 23:24:51
【问题描述】:
我的模型在以 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;
}
这是视图,缺少播放器列表输入的代码,这是因为它通过 jquery 附加到播放器表单 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 已完美设置,所有值都已插入,我只需将所有内容保存到 DB。但是,当它返回到控制器时,TeamFormModel 中的锦标赛变量为空。因此,当我将其发送到将其更改为 Db 模型并将其提交给 db 的函数时,每次都会失败。
我知道有一些方法可以解决这个问题,比如只保留比赛的 id 而不是整个模型,然后在提交表单后从 db 中获取它,但它的这种行为确实让我感到烦恼。
我无法在 stackoverflow 上找到有关此特定问题的任何内容,有一些类似的问题,但没有以相同的方式呈现。
【问题讨论】:
-
比赛ID设置了吗?
-
是的,发布后不会改变。
-
在哪里可以控制锦标赛对象?
-
锦标赛对象在提交到视图之前被添加到模型中。我认为模型活页夹在发布期间不会改变这一点。我是否需要添加特定于视图的内容以使其不会消失?
-
是的,您希望从视图传递到操作方法的每个值都必须有一个控件。不会自动携带任何值。在这种情况下,这意味着对锦标赛对象中的每个值都有一个控件。这是一个很大的痛苦。我只需将锦标赛 ID 发送到隐藏控件中,并在我到达发布操作时拉出对象。
标签: asp.net-mvc asp.net-mvc-4 model http-post