0

我有两个模型,有。

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

public class CreateAssignmentSelectedItem {
    ...
}

现在我有一个视图 where contains CreateAssignmentViewModel,正如您在上面看到的那样,这个类包含一个属性 where is aList<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(..);
    }

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

4

2 回答 2

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)
于 2013-03-13T00:36:26.307 回答
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 的建议,您应该使用 pass a 模型;

于 2013-03-13T05:25:38.613 回答