【问题标题】:Model binding difficulty模型绑定难度
【发布时间】:2010-06-16 01:34:57
【问题描述】:

我有一个模型,我正在使用 ajax.post。我可以看到模型绑定没有为我的模型中的数组列表完成,尽管绑定是为 int 或 string 类型的属性完成的。为什么呢?我的代码如下。

我有一个具有以下属性的模型

public class ProjectModel
{
    public int ID { get; set; }
    public ArrayList Boys= new ArrayList();

}

在我看来我有

  $(document).ready(function () {
     var project = new Object();
      var Boys= new Array();
var ID;
.......
ID = $('#ID').val();
project.Boys= Boys;

.....

$.ajax({
                 type: "POST",
                 url: '<%=Url.Action("Create","Project") %>',
                 data: JSON.stringify(project),
                 contentType: "application/json; charset=utf-8",
                 dataType: "html",
                 success: function () {
                 },
                 error: function (request, status, error) {
                                         }
             });

//

我的控制器

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(ProjectModel project)
    {
        try
        {
            project.CreateProject();
            return RedirectToAction("Index");
        }

....

【问题讨论】:

  • ArrayList 不是通用的。您打算在里面存储什么类型的对象?在您需要定义Boy 类型的每个属性的情况下,通用的List&lt;Boy&gt;Boy[] 会更合适。
  • 你能用一个例子解释一下吗?我正在视图中填充数组并希望拥有数组模型绑定。实际上我可以看到从视图发送的值没有绑定到模型,并且数组仍然具有已经实例化的值。我该如何解决这个问题?

标签: asp.net-mvc model-view-controller


【解决方案1】:

ModelBinding 是使用名称完成的。 对于您要绑定的任何 Collection,它必须具有以下格式:

project.property1
project.property2

男孩系列

project.Boys[0].property1
project.Boys[0].property2

project.Boys[1].property1
project.Boys[1].property2

如果您使用的是表单,您只需正确设置输入的名称并使用 jquery:

//inside the ajax definition
    data: $('#formID').serialize(),

编辑:如果男孩没有属性,那么名称应该是:

project.Boys[0]
project.Boys[1]
project.Boys[2]

你试过用这样的第二个参数绑定吗?

public ActionResult Create(ProjectModel project, string[] Boys)

我没有使用ArratList,因为我做了一些测试,它似乎根本没有绑定,我更喜欢使用普通的数组声明。

您可以尝试的另一件事是检查FormCollection

public ActionResult Create(FormCollection f)

在开头放置一个断点并检查值,如果里面的名称不遵循格式 project.Boys 它永远不会绑定。

EDIT2:如果你想绑定到多个数组,那么只需在模型中添加一个集合定义:

public class ProjectModel

    {
        public IEnumerable<string[]> Boys { get; set; }
    }

名称应该是: 对于第一个数组:

project.Boys[0]
project.Boys[0]

第二个:

project.Boys[1]
project.Boys[1]

。 . .

但是为了存档,Javascript 中 Boys 的定义也应该是一个集合的集合,我不确定如何在 js 中定义它。

PD:如果您手动将值推送到数组,并且值来自输入,正如您在此处所述 Boys.Push($('#tex1').val()),那么您应该能够序列化这些输入并为您节省大量麻烦=D。 即:模拟您的情况,它将类似于...

<% using (Html.BeginForm())
       { %>
       <% var i1 = 5; %>
       <% var i2 = 5; %>
       <% for(var i=0; i < i1; i++)
          { %>
          <% for (var ix = 0; ix < i2; ix++)
             {%>
          <input name="boys[<%=i %>]"  value="VALUE_HERE"/>
          <%} %>
       <%} %>
       <input type="submit" value="sumit" />
    <%} %>

并执行data: $('#formID').serialize() 得到与创建project js 对象然后执行JSON.stringify(project) 相同的结果。

【讨论】:

  • Boys 只是一个数组列表,我将数组填充为 Boys.Push($('#tex1').val()) 并且它没有任何属性。
  • @user Omar 说您不能使用带有模型绑定的 ArrayList。如果您只是想要一个字符串列表(在我看来就是这样),那么您可以发布一个逗号分隔的字符串并将其拆分为服务器端。
  • 谢谢奥马尔,我还是有困难。实际上我必须使用 javascript 对数组进行模型绑定,困难的部分是我有 5 - 6 个数组,我不知道如何进行。
  • 好的,我在答案中添加了我的解决方案,请看最后一部分,我认为当你创建一个 JS 对象然后执行 JSON.stringify 时,你是双重工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多