MVC ViewModel问题

时间:2013-02-14 10:30:47

标签: asp.net-mvc asp.net-mvc-3

我有一个具有2个属性的viewmodel,第一个属性是Model对象,第二个属性是List。在我的视图中我有2个部分。

第一部分填充第一个对象的数据,名字,姓氏,电子邮件和其他一些东西。

我视图的第二部分是用户添加多个地址的webgrid。

现在我的问题是什么,我的控制器上有一个JSON操作,它从表单中获取数据,将它们添加到viewmodel List属性,但没有任何反应。

我检查过数据来自视图,添加到viewmodel但是每次viewmodel为空。

[Authorize]
public JsonResult addAddress(Address addr, CustomerViewModel model)
{
    if (model.CAddress== null)
        model.CAddress= new List<Address>();

    model.CAddress.Add(addr);

    return Json(model, JsonRequestBehavior.AllowGet);
}

[Authorize] public JsonResult addAddress(Address addr, CustomerViewModel model) { if (model.CAddress== null) model.CAddress= new List<Address>(); model.CAddress.Add(addr); return Json(model, JsonRequestBehavior.AllowGet); }

我正在使用Javascript:

function AddAddress() 
{ 
 var addID = $("#lstID option:selected").val(); 
 var addName = $("#lstAddName option:selected").text(); 

 var Address = 
 { 
  addID : addID.toString(), 
  addName : addName.toString() 
 }; 

$.ajax({ 
 type: "POST", 
 url: "@Url.Action("addAddress","Customer")", 
 dataType: "json", contentType: "application/json; charset=utf-8", 
 data: JSON.stringify(Address), 
 success: function (data) {} }); }; 

1 个答案:

答案 0 :(得分:0)

好吧,首先写一个真实的视图模型,而不是一些混合动力:

public class CustomerViewModel 
{
    public List<AddressViewModel> Addresses { get; set; }

    ... some other properties you already had
}

public class AddressViewModel
{
    public string Id { get; set; }
    public string Name { get; set; }
}

然后调整控制器动作以获取真实视图模型,而不是视图模型和域模型之间的混合和混合:

[Authorize]
[HttpPost]
public ActionResult AddAddress(CustomerViewModel model)
{
    return Json(model);
}

最后调整你的AJAX调用:

function AddAddress() { 
    $.ajax({ 
        url: '@Url.Action("AddAddress", "Customer")', 
        type: 'POST', 
        contentType: 'application/json; charset=utf-8', 
        data: JSON.stringify({ 
            addresses: [
                { 
                    id : $('#lstID').val(), 
                    name : $('#lstAddName option:selected').text()
                }
            ],
            someOtherPropertyOnYourViewModel: 'some other value'
        }), 
        success: function (data) {

        } 
    }); 
}