我在视图上使用以下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将对视图模型的更改映射回实际模型,只有一个字段可以更改视图模型。这可能不是理想的方法,但我仍在尝试确定应该如何处理。

我的两个问题是:

1-表单提交时似乎没有将任何内容传递回控制器。因此,“模型”对象为空,为null。这使我相信我以为我对自己所做的事情的理解是错误的。为什么更新后的字段没有传递回控制器?

2-这是更新视图模型中单个字段的值的最佳方法吗?

谢谢

最佳答案

您有一个非常复杂的模型,内部模型绑定程序将不知道如何处理它,因为您有一个对象的IEnumerable,而您正在编辑(或隐藏)第一个progress1 cc>。您必须创建一个自定义模型活页夹。

视图上发生的事情是它存储了Enrollment的输入标签,但是当控制器获取它时,就不会知道它属于哪个progress1对象。

尝试仅将第一个Enrollment传递给视图以进行编辑。

09-28 06:55