【问题标题】:C# MVC - View returns Model null on PostbackC# MVC - 视图在回发时返回模型 null
【发布时间】:2014-09-25 14:07:29
【问题描述】:

我完全不知道为什么模型在提交表单后为空.....我检查了 FormCollection,但它只包含“ScriptAssignments.Assigned”。我使用的是强类型视图,并且我使用的是 beginform....我没有弄错这里...我将不胜感激。

这就是视图的样子.....

@model Models.ScriptAssignmentMatrix

@{
   ViewBag.Title = "Script Matrix";
}

<link href="@Url.Content("~/Content/RotatedHeaders.css")" rel="stylesheet" type="text/css" />

<h1>Assignment Matrix</h1>

@using (Html.BeginForm("SaveChanges", "ScriptMatrix",FormMethod.Post)) {
<div style=" height:15px"></div>    
<table class="table table-striped table-header-rotated">
   <thead>
      <tr>
        <th></th> 
        @foreach (var header in Model.ColumnHeaders) 
        {
            <th>
                <div class="container"><div class="head"><div class="vert">
                    <span style="font-size: 10pt">
                        @Html.DisplayFor(modelItem => header)
                    </span>
                </div></div></div>
            </th>
        }
      </tr>
    </thead>

    <tbody>

    @foreach (var row in Model.RowHeaders)
    {
        <tr>
            <td>
                <span style="font-size: 10pt; background: #eee; ">
                    @Html.DisplayFor(modelItem => row)
                </span>
            </td>
            @foreach (var header in Model.ColumnHeaders)
            {
                var ScriptAssignments = (from y in Model.ScriptAssignments
                               where y.AgentName == row && y.ScriptName == header
                               select y).First();
                <td>     
                    @Html.CheckBoxFor(Assignment => ScriptAssignments.Assigned) 
                </td>
            }
        </tr>

    }
    </tbody>

</table>

<div style=" height:30px"></div>    
<input type="submit" value="Save Changes" />
<div style=" height:30px"></div>    
 @ViewBag.Result

}

这是控制器:

    [HttpPost]
    public ViewResult SaveChanges(ScriptAssignmentMatrix model)
    {

        ViewBag.Result = "Your changes have been saved";
        return View("Index", model);
    }

这是 ScriptAssignmentMatrix 类:

public class ScriptAssignmentMatrix
{
    public List<ScriptAssignmentMatrixElement> ScriptAssignments { get; set; }
    public List<String> ColumnHeaders { get; set; }
    public List<String> RowHeaders { get; set; }
}

public class ScriptAssignmentMatrixElement
{
    public int ScriptId { get; set; }
    public string  ScriptName { get; set; }

    public int AgentId { get; set; }
    public string AgentName { get; set; }

    public bool Assigned { get; set; }
}

【问题讨论】:

  • foreach 可能有问题。请改用for 循环。见this post
  • DisplayFor 不会创建 input 元素。要修复它,请在每个 DisplayFor 之后使用 HiddenFor
  • DisplayFor 仅用于表头...需要保存在模型中的数据在嵌套的 foreach 中
  • 在我在嵌套 foreach 中使用 CheckboxFor 的少数经验中,它的工作方式是使用 for 循环作为 @gunr2171 注释。试一试。
  • 如果您不使用HiddenFor 字段发布标头值,模型绑定可能不会正确发生。 MVC 喜欢在发布期间取回所有模型字段以进行绑定。尝试添加隐藏字段,看看会发生什么。

标签: c# asp.net asp.net-mvc


【解决方案1】:

DisplayFor 不将控件与模型绑定。所以最好的办法就是使用HiddenFor。

@foreach (var header in Model.ColumnHeaders) 
{
    <th>
        <div class="container"><div class="head"><div class="vert">
            <span style="font-size: 10pt">
                @Html.DisplayFor(modelItem => header)
                @Html.HiddenFor(modelItem => header)
            </span>
        </div></div></div>
    </th>
}

【讨论】:

    【解决方案2】:

    所以我终于找到了答案......仍然无法解释为什么......但这是视图的工作修改代码......

    感谢 gunr2171 和 Jorge F....你们的 cmets 让我走上了正轨.....

    Models.ScriptAssignmentMatrix
    
    @{
        ViewBag.Title = "Script Matrix";
    }
    
    <link href="@Url.Content("~/Content/RotatedHeaders.css")" rel="stylesheet" type="text/css" />
    
    <h1>Assignment Matrix</h1>
    
    @using (Html.BeginForm("SaveChanges", "ScriptMatrix",FormMethod.Post)) {
    
    <div style=" height:15px"></div>    
    <table class="table table-striped table-header-rotated">
       <thead>
          <tr>
            <th></th> 
            @foreach (var header in Model.ColumnHeaders) 
            {
                <th>
                    <div class="container"><div class="head"><div class="vert">
                        <span style="font-size: 10pt">
                            @Html.DisplayFor(modelItem => header)
                        </span>
                    </div></div></div>
                </th>
            }
          </tr>
        </thead>
    
        <tbody>
    
        @for (int row = 0; row < Model.RowHeaders.Count; row++ )
        {
            <tr>
                <td>
                    <span style="font-size: 10pt; background: #eee; ">
                        @Html.DisplayFor(modelItem => Model.RowHeaders[row])
                    </span>
                </td>
                @for (int column = 0; column < Model.ColumnHeaders.Count; column++ )
                {
    
                    for (int index = 0; index < Model.ScriptAssignments.Count; index++)
                    {
                         if (Model.ScriptAssignments[index].AgentName == Model.RowHeaders[row] && Model.ScriptAssignments[index].ScriptName == Model.ColumnHeaders[column])
                         {
                            <td>     
                                @Html.CheckBoxFor(Assignment =>  Model.ScriptAssignments[index].Assigned) 
                                @Html.HiddenFor(x =>  Model.ScriptAssignments[index].AgentId)
                                @Html.HiddenFor(x =>  Model.ScriptAssignments[index].ScriptId)
                                @Html.HiddenFor(x =>  Model.ScriptAssignments[index].AgentName)
                                @Html.HiddenFor(x =>  Model.ScriptAssignments[index].ScriptName)
                            </td>                             
                             break;
                         }
    
                    }                    
                }
            </tr>
        }
        </tbody>
    
    </table>
    
    <div style=" height:30px"></div>    
    
    <input type="submit" value="Save Changes" />
    <div style=" height:30px"></div>    
     @ViewBag.Result
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      相关资源
      最近更新 更多