我有两个型号,有。
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(..);
}
如何只传递方法中的对象?
答案 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建议你应该使用传递模型;