通过Ajax发布几个强类型模型

时间:2015-06-26 18:16:40

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

我试图通过几个_PartialView向我的控制器发送在我的视图中表示的几个模型。 例如:我的主页面包含对象模型的字段,但它还包含一个包含对象ModelDetail字段的部分视图。

我希望控制器中的操作如下:

public ActionResult SaveAll(Model model, ModelDetail detail)
{
    ........
}

所以我做了这样的功能:

var MainInfo = $('form#MainInfo').serialize();
var DetailInfo = $('#Details :input').serialize();
var dataPost = { model: MainInfo , modelDetail: DetailInfo };
 $.post(saveCompleteUrl, dataPost).sucess() {
 }
 ...........

但它不起作用,两个参数在Controller中都为空。而且我无法初始化对象,因为在Details中我有一个包含n个对象的集合......

无论如何要做这项工作还是我需要分开行动?一个保存主模型第二个保存详细信息。我知道这个解决方案有效,但我宁愿使用另一个。

编辑:2015/06/29: 我尝试了很多不同的方法来做到这一点,但我从未成功,对象内的数据总是为空,我能让它工作的唯一方法就是:

 var litigationMainInfo = $('form#MainLitigationInfo').serialize();
            var litigationDetailInfo = $('#litigationDetails :input').serialize();
            $.post(saveUrl, litigationMainInfo)
                .success(function (data) {
                    var actionResult = data.Result;
                    if (actionResult.Success) {
                        $.post(saveDetailsUrl, litigationDetailInfo)
                              .success ....

SaveUrl = '@Url.Action("Save", "Litigation")',"Save"
saveDetailsUrl = '@Url.Action("SaveDetails", "Litigation")',"Save"

[AjaxOnly]
public ActionResult Save(EditModel model){...}

[AjaxOnly]
public ActionResult SaveDetails(DetailEditModel model){...}

但是这个:

public ActionResult Save(EditViewModel m){...}

public class EditViewModel
{
     EditModel model;
     DetailEditModel detailModel;
}

var MainInfo = $('form#MainInfo').serialize();
var DetailInfo = $('#Details :input').serialize();
var dataPost = { model: MainInfo , detailModel: DetailInfo };
 $.post(saveCompleteUrl, dataPost).sucess() {
 }

我使用的方法签名是:

public ActionResult SaveComplete(ViewModel model){...}
public ActionResult SaveComplete(EditModel editModel, EditDetailModel detailsModel){...}

奇怪的是,EditModel为null,但DetailEditModel不是。 DetailEditModel中的值设置为默认值(对于Ids为0,对于字符串为null)

我不明白,当我两次打电话时,这是"工作"但是只要我想在同一个电话中发送这两个模型就行不通。

顺便说一句,cshtml主页由2个PartialViews组成。第一个是绑定到EditModel。第二个也绑定到EditModel,因为我使用对象的id来获取细节,但第二个局部视图是一个像这样定义的标签条(KendoUI):

@model FileEditModel

@Html.HiddenFor(x => x.Id)
@(Html.Kendo().TabStrip()
    .Name("tabStrip")
    .Items(tabStrip => {
        tabStrip.Add().Text("Details")
            .Selected(true)
            .LoadContentFrom("GetDetails", "Litigation", new { LitigationFileId = Model.Id });

这是GetDetails方法:

public ActionResult GetDetails(int Id)
        {
            if (LitigationFileId != 0)
            {
                DetailEditModel model = LoadData(Id);
                return PartialView("_details", model);
            }
            else
            {
                DetailEditModel model = new DetailEditModel();
                return PartialView("_details", model);
            }
        }

1 个答案:

答案 0 :(得分:0)

我的建议是创建一个包含每个类的属性的视图模型类

public class ViewModel 
{
     public Model Model;
     public ModelDetail ModelDetail;
}

public ActionResult SaveAll(ViewModel viewModel)
{
    ........
}    

您的ajax调用应该与此服务器端更改完美配合

相关问题