c#MVC帖子没有填充视图模型

时间:2018-04-05 11:54:34

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

我有一个ViewModel,它的属性定义为Division类型的IList。 Division对象如下:

public class DivisionViewModel :
{
    public int Id { get; set; }

    public int DivisionId { get; set; }

    public string Name { get; set; }

}

过去,我刚刚在视图中创建了以下内容:

<div class="divisions">
    @for (int i = 0; i < Model.Divisions.Count(); i++)
    {
        @Html.Hidden(Model.Divisions[i].DivisionId.ToString(), new { @name = "Divisions[" + i + "].DivisionId", @id = "Divisions_" + i + "__.DivisionId" })
        @Html.Hidden(Model.Divisions[i].Id.ToString(), new { @name = "Divisions[" + i + "].Id", @id = "Divisions_" + i + "__.Id" })
        @Html.Hidden(Model.Divisions[i].Name, new { @name = "Divisions[" + i + "].Name", @id = "Divisions_" + i + "__.Name" })
    }
</div>

当我提交页面时,在检查返回的ViewModel时,我发现已填充了DivisionId,但Id和Name属性都没有。

我已注释掉设置DivisionId的行,但仍然返回但没有Id和Name属性

我错过了什么?

1 个答案:

答案 0 :(得分:5)

模型绑定失败的最常见原因是输入的$SQLServer = "Server\SQLEXPRESS" $SQLDBName = "Prova" $SqlQuery = "Select * from table_2 where id=1" $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; trusted_connection=true;" $SqlConnection.Open() $SqlCmd = New-Object System.Data.SqlClient.SqlCommand $SqlCmd.CommandText = $SqlQuery $SqlCmd.Connection = $SqlConnection $SqlAdapter.SelectCommand = $SqlCmd $Dataset = New-Object System.Data.DataSet $SqlAdapter.Fill($Dataset) $array=$Dataset.Tables[0] $SqlConnection.Close() 属性与模型中属性的名称不匹配,首先应该检查html您的代码是实际产生。假设第一个项目中name的值为DivisionId,那么您生成的是

1

与您的模型无关。

  • 第一个参数是要绑定的属性,您要告诉它 绑定到名为<input name="1" type="hidden" value="{ @name = Divisions[0].DivisionId, @id = "Divisions_0__.DivisionId }" /> 的属性 - 1的结果,该属性不存在,并且是非法的 反正
  • Model.Divisions[i].DivisionId.ToString()的第二个参数是该属性的@Html.Hidden(), 所以你告诉它使用你的匿名对象作为值
  • 即使您添加了第二个参数(以便html属性 将从匿名对象生成),自使用以来它仍然无法工作 幸运的是value什么都没做 - 使用的目的 @name="..."方法是正确绑定到您的模型)

只需使用

HtmlHelper

将生成正确的名称和值属性以绑定到您的集合。

话虽如此,你所拥有的只是隐藏的输入,所以生成所有额外的html,将它发送到浏览器并将其全部重新发送回来没有任何意义。如果您在POST方法中需要该集合,那么只需从您的存储库中获取它。

作为旁注,你的@for (int i = 0; i < Model.Divisions.Count; i++) { @Html.HiddenFor(m => m.Divisions[i].DivisionId) @Html.HiddenFor(m => m.Divisions[i].Id) @Html.HiddenFor(m => m.Divisions[i].Name) } 毫无意义。添加new { @id = ".." }属性的目的是在css和javascript / jquery选择器中使用,这对于集合项实际上没有意义,但在任何情况下都不起作用,因为你有一个id(点)它将充当类名选择器