Javascript 对集合使用getter时,ASP.NET MVC3模型绑定器数据无效

Javascript 对集合使用getter时,ASP.NET MVC3模型绑定器数据无效,javascript,jquery,asp.net-mvc-3,model-binding,Javascript,Jquery,Asp.net Mvc 3,Model Binding,用这种接触模型 public class Contact { public string Name { get; set; } public ICollection<Phone> Phones { get; set; } public Phone PrimaryPhone { get { return Phones.FirstOrDefault(x => x.Primary) ?? new Phone(); } } }

用这种接触模型

public class Contact
{
    public string Name { get; set; }
    public ICollection<Phone> Phones { get; set; }

    public Phone PrimaryPhone
    {
        get { return Phones.FirstOrDefault(x => x.Primary) ?? new Phone(); }
    }
}

public class Phone
{
    public bool Primary { get; set; }
    public string PhoneNumber { get; set; }
    public string Type { get; set; }
}
当我使用jQuery发布到HomeController索引时

(function ($) {
        var myData = {
            Name: 'Wesley Crusher',
            Phones: [
                { Primary: false, PhoneNumber: '111-111-1111', Type: 'Business' },
                { Primary: true,  PhoneNumber: '222-222-2222', Type: 'Personal' },
                { Primary: false, PhoneNumber: '333-333-3333', Type: 'Business' }
            ],
            PrimaryPhone: { Primary: true, PhoneNumber: '111-111-1111', Type: 'Business' }
        };

        $.ajax({
            url: '@Url.Action("Index", "Home")',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify(myData)
        });
    })(jQuery)
型号绑定器用于构建ICollection手机。数据为:

  • [0]Primary=false,PhoneNumber=“111-111-1111”,Type=“Business”MVC3ModelBinderJsonTesting.Models.Phone
  • [1] Primary=true,PhoneNumber=“111-111-1111”,Type=“Business”MVC3ModelBinderJsonTesting.Models.Phone
  • [2] Primary=false,PhoneNumber=“333-333-3333”,Type=“Business”MVC3ModelBinderJsonTesting.Models.Phone
电话号码“111-111-1111”重复,类型为“业务”而不是“个人”。这是出于某种原因的预期行为还是一个错误


如果您愿意,我可以发布一个示例项目,让我知道。

我认为发布
PrimaryPhone
是造成问题的原因。尝试删除

PrimaryPhone: { Primary: true, PhoneNumber: '111-111-1111', Type: 'Business' }

由于此属性只有一个getter,并且将由
主属性正确地确定,因此它应该仍然具有有效数据。

我认为这是因为它不是原语。它是一个复杂的对象,因此模型绑定器尝试设置其属性

模型绑定更适合于绑定表示表单输入的“输入模型”。在输入模型上使用业务逻辑计算属性可能不是您所看到的最佳方法

您可能需要一个扩展方法(遗憾的是不支持扩展属性),而不是输入模型的属性。甚至是一种合适的方法。将其作为一项财产,会让模型绑定者认为这是一场公平的游戏


如果它是get only原语类型,它不会尝试设置它。

是的,OP不应该发布PrimaryPhone,因为它无论如何都是一个派生属性,没有setter。这确实解决了它,但我更希望不必编辑ajax数据。如果我或其他人在将数据发送到服务器之前忘记编辑数据,这会导致数据损坏,这是不好的。@RyanP为什么我为一个只有getter的属性发送数据很重要,你不希望model binder忽略它,因为它没有setter吗?也许添加一个setter,检查匹配的电话号码和类型,并设置主属性。如果没有匹配项(如示例中所示),则向集合中添加一个新项。(注意,不知道这是否适用于绑定。)将setter添加到
Contact.PrimaryPhone
似乎无法修复它。尝试了
set{System.Diagnostics.Debug.Write(“test”)}
set{{u testPhone=value;}
(我创建了
\u testPhone
作为
private Phone\u testPhone;
),而model binder认为这是一个公平的游戏,如果正在发送的PrimaryPhone对象与Phones数组中的PrimaryPhone数据匹配,则看起来一切正常。我不认为PrimaryPhone属性可以在这种情况下更改为方法,但这也可能是另一种修复方法。谢谢你的洞察力!
PrimaryPhone: { Primary: true, PhoneNumber: '111-111-1111', Type: 'Business' }