提交Ajax表单但没有发送给控制器?

时间:2016-07-15 13:52:33

标签: javascript jquery ajax asp.net-mvc entity-framework

我在我的视图中使用了以下viewModel:

public class CourseViewModel
{
    public IEnumerable<Course_page> Course_page { get; set; }
    public IEnumerable<course_section> Course_section { get; set; }
    public IEnumerable<course_subsection> Course_subsection { get; set; }
    public IEnumerable<Enrollment> Enrollments { get; set; }
}

在我看来,我有以下ajax形式:

@using (Ajax.BeginForm("updateprogress", "User", new { EnrollmentID = Model.Enrollments.Single().EnrollmentID }, new AjaxOptions
            {
                HttpMethod = "POST",

            }, new { id = "ajaxForm" }))
            {
                @Html.HiddenFor(Model => Model.Enrollments.Single().progress1, new { id = "scenecheck" })
            }

我有一个名为Hype的程序生成的动画,在动画中是场景,当前场景编号使用javascript函数调用,其值填充在'progress1'字段中的上述表格中:

function updateprogress(hypeDocument, element, event) {

var scenenumber = hypeDocument.currentSceneName();

hypeDocument.getElementById('scenecheck').value = scenenumber;

$('form#ajaxForm').submit();

}

我有一些其他的javascript来监听场景变化,并在它发生变化时调用上面的函数。

当我在页面上将HiddenFor更改为TexboxFor时,我可以看到视图中的所有内容都正常工作,场景编号出现在文本框中。

此表单提交时我的控制器操作如下:

[Authorize]
    [HttpPost]
    public ActionResult updateprogress(int EnrollmentID, CourseViewModel model)
    {
        Enrollment enrollment = db.enrollment.Find(EnrollmentID);
        Mapper.Map(model, enrollment);
        db.SaveChanges();

        return null;


    }

我正在使用Automapper将更改映射到viewmodel回到实际模型,在viewmodel中只需更改一个字段。这可能不是理想的做法,我还在努力弄清楚我应该如何解决这个问题。

我的两个问题是:

1 - 表单在提交时似乎没有将任何内容传递回控制器。所以'model'对象是空的,null。这让我相信我认为我所理解的事情是错误的。为什么更新的字段没有传回控制器?

2 - 这是更新viewmodel中单个字段值的最佳方法吗?

由于

1 个答案:

答案 0 :(得分:1)

你有一个非常复杂的模型,内部模型绑定器不会知道如何处理它,因为你有一个IEnumerable的对象并且你正在编辑(或隐藏在这种情况下)第一个progress1的{​​{1}}。您必须创建自定义模型装订器。

视图上发生了什么?它存储了Enrollment的输入标记,但是当控制器获取它时,它不会知道哪个{{1}它属于的对象。

尝试将第一个progress1传递到您的视图进行编辑。