如何将对象从ajax传递到MVC中的服务器?

时间:2013-03-13 00:27:19

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

我有两个型号,有。

public class CreateAssignmentViewModel {
    ...
    public List<CreateAssignmentSelectedItem> SelectedItems { get; set; }
}

public class CreateAssignmentSelectedItem {
    ...
}

现在我有一个包含CreateAssignmentViewModel的视图,如上所示,此类包含的属性为List<CreateAssignmentSelectedItem>

@model Contoso.MvcApplication.Models.Assignment.CreateAssignmentViewModel
@{
    ViewBag.Title = "Create Assignment";
    ...
}

@using (Html.BeginForm()) {
    ...
}

Html.BeginForm的内部,我有一个局部视图。在其中我有一个使用ajax的按钮来更新局部视图。

查看以下事件。说数据的位置:我不知道要输入什么来仅访问属性SelectedItems

var addQuestionToAssignmentContent = function (questionId)
{
    $.ajax({
        url: "/Assignment/AddItemToAssignmentContent",
        type: "post",
        data: { model: $(this).serialize() /* HERE I DON'T KNOW TO ACCESS THE */, itemId: questionId },
        success: function (response) {
            var $target = $("#assignmentContent");
            var $newHtml = response;
            $target.replaceWith($newHtml);
        }
    });
};

    public ActionResult AddItemToAssignmentContent(List<CreateAssignmentSelectedItem> model, string itemId)
    {
        ...
        PartialView(..);
    }

如何只传递方法中的对象?

2 个答案:

答案 0 :(得分:3)

首先,给你的表单一个ID:

@using (Html.BeginForm("actionName", "controllerName", FormMethod.Post, new{id = "frmUpdate"})) {

其次,将代码更改为:

var f = $("#frmUpdate");
    $.ajax({
        url: f.attr('action'),
        type: f.attr('method'),
        data: f.serialize(),
        //etc..

我在大多数情况下使用它,它的效果很好。数据应自动绑定到更新操作中的模型。因此,例如......如果您的@model类型为MyModel,那么在更新操作中它应该如下所示:

[HttpPost]
public ActionResult Update(MyModel updatedModel)

答案 1 :(得分:0)

有时我和一个前端人员一起工作,他可能不会坚持传递正确的模型,他可能会更改表单字段或其他任何内容。在这种情况下,我只是让他序列化表单并以任何他想要的方式将其传递给动作。

然后我使用FormCollection对象来获取我需要的数据。

你的json电话

var addQuestionToAssignmentContent = function (questionId)
{
    $.ajax({
        url: "/Assignment/AddItemToAssignmentContent",
        type: "post",
        data: { model: $(this).serialize() /* HERE I DON'T KNOW TO ACCESS THE */, itemId: questionId },
        success: function (response) {
            var $target = $("#assignmentContent");
            var $newHtml = response;
            $target.replaceWith($newHtml);
        }
    });
};
Get a form collection object

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddItemToAssignmentContent(FormCollection collection)
{
       vars someValue = collection.GetValue("somefield").AttemptedValue;
}

但是,如果我像你那样控制前端,那么Matt建议你应该使用传递模型;