Asp.net mvc 模型中的一个变量在http post后变为null

Asp.net mvc 模型中的一个变量在http post后变为null,asp.net-mvc,asp.net-mvc-4,model,http-post,Asp.net Mvc,Asp.net Mvc 4,Model,Http Post,我的模型在以http post表单提交时丢失了一个值,这是一个问题 控制器方法: [HttpGet] public ActionResult AddTeam(int id) { return PartialView("_AddTeam", ViewModelGenerator.TeamFormModel(id)); } [HttpPost] public ActionResult AddTeam(TeamFormModel model) { TournamentTeamServ

我的模型在以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; }
}
公共类TeamFormModel
{
公共团队视图模型团队{get;set;}
公开锦标赛ViewModel锦标赛{get;set;}
公共列表玩家{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;
}
public静态TeamFormModel TeamFormModel(int-id)
{
varu db=new DbContext();
var模型=新的TeamFormModel();
var tempModel=new TournamentViewModel();
var temp=(从t in_db
其中t.Id==Id
选择t).SingleOrDefault();
tempModel.Id=temp.Id;
tempModel.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=新列表();
模型。锦标赛=临时模型;
收益模型;
}

这里的视图,带有玩家列表的输入的代码丢失,这是因为它是通过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>
}
@model Context.ViewModels.TeamFormModel
@使用(Html.BeginForm(“AddTeam”、“Tournament”、FormMethod.Post、new{enctype=“multipart/formdata”、@class=“form horizontal”}))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
将团队注册到@Model.Tournament.Name
@LabelFor(model=>model.Team.Name)
@EditorFor(model=>model.Team.Name)
}
在我提交此表单之前,TeamFormModel已经完全设置好,所有值都被插入,我只需要将所有内容保存到DB。但是,当它返回控制器时,TeamFormModel中的锦标赛变量为null。所以,当我将它发送到一个函数,该函数将它更改为Db模型并提交给Db时,每次都会失败

我知道有很多方法可以解决这个问题,比如只保留比赛的id,而不是整个模型,然后在表单提交后从db获得它,但它的这种行为真的让我很烦


我在stackoverflow上找不到关于这个特定问题的任何信息,有一些类似的问题,但没有一个问题以相同的方式呈现出来。

您必须设置类似的内容

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

必须保留在渲染视图时传递到视图中的模型值,这将在post时将值传递回控制器

是否设置了锦标赛id?是,发布后它不会更改。在哪里有控件来执行锦标赛对象?锦标赛对象将在提交到视图之前添加到模型中。我认为模型绑定器在发布期间不会改变这一点。我是否需要为视图添加特定的内容,使其不会消失?是的,您希望从视图携带到操作方法的每个值都必须有一个控件。不会自动携带任何值。在本例中,这意味着对锦标赛对象中的每个值都有一个控件。这是一个巨大的痛苦。我只会在一个隐藏的控件中发送比赛id,并在到达后期操作时拉出对象。Dave a在之前的评论中指出了这一点。因为我记不清他的答案,所以把这个作为答案。谢谢你的帮助。