编程语言
首页 > 编程语言> > javascript – 当对集合使用getter时,ASP.NET MVC3模型绑定器数据无效

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

作者:互联网

有了这个Contact模型

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; }
}

而这个控制器

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(Contact contact)
    {
        return View();
    }
}

当我使用jQuery POST到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

重复PhoneNumber“111-111-1111”,类型为“Business”而不是“Personal”.出于某种原因这是预期的行为还是这个错误?

如果您愿意,我可以发布一个示例项目,请告诉我.

解决方法:

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

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

你可能有一个扩展方法(遗憾的是不支持扩展属性)而不是输入模型的属性.甚至是一个合适的方法.拥有它成为一个属性使模型绑定器认为它是公平的游戏.

如果它是一个只获取原始类型,它将不会尝试设置它.

标签:javascript,jquery,asp-net-mvc-3,model-binding
来源: https://codeday.me/bug/20190826/1730631.html