【问题标题】:One variable in model becomes null after http posthttp post 后模型中的一个变量变为空
【发布时间】: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


【解决方案1】:

你必须设置这样的东西

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

在渲染视图时必须保留传递给视图的模型的值,这将在发布时将值传递回控制器

【讨论】:

  • Dave A 在之前的评论中指出了这一点。将此标记为答案,因为我无法标记他。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多