Asp.net mvc 5 部分视图数据未粘贴到模型时出错

Asp.net mvc 5 部分视图数据未粘贴到模型时出错,asp.net-mvc-5,Asp.net Mvc 5,你好。我真的不知道该修哪一部分。 这是视图模型 public class EmployeeViewModel { public int ID { get; set; } public string LastName { get; set; } public string FirstName { get; set; } public virtual ICollection<FacultySchedViewModel> FacultySchedul

你好。我真的不知道该修哪一部分。 这是视图模型

    public class EmployeeViewModel
{
    public int ID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public virtual ICollection<FacultySchedViewModel> FacultyScheduleViewModels { get; set; }
}

public class FacultySchedViewModel
{
    public int ID { get; set; }
    public int EmployeeID { get; set; }
    public string Schedule { get; set; }
    public string Room { get; set; }   
}
在主视图中,javascript可以在部分视图中动态创建文本框

<script>
function addRow(tableID) {
    var table = document.getElementById(tableID);
    var rowCount = table.rows.length;
    var row = table.insertRow(rowCount);
    var colCount = table.rows[0].cells.length;
    for (var i = 0; i < colCount; i++) {

        var newcell = row.insertCell(i);
        newcell.innerHTML = table.rows[0].cells[i].innerHTML;
        switch (newcell.childNodes[0].type) {
            case "text":
                newcell.childNodes[0].value = "";
                break;
            case "checkbox":
                newcell.childNodes[0].checked = false;
                break;
            case "select":
                newcell.childNodes[0].selectedIndex = 0;
                clear_attrib();
                break;
        }
    }
}

function deleteRow(tableID) {
    try {
        var table = document.getElementById(tableID);
        var rowCount = table.rows.length;
        for (var i = 0; i < rowCount; i++) {
            var row = table.rows[i];
            var chkbox = row.cells[0].childNodes[0];
            if (null != chkbox && true == chkbox.checked) {
                if (rowCount <= 1) {
                    alert("Cannot delete all the rows.");
                    break;
                }
                table.deleteRow(i);
                rowCount--;
                i--;
            }
        }
    } catch (e) {
        alert(e);
    }
}

函数addRow(tableID){
var table=document.getElementById(tableID);
var rowCount=table.rows.length;
var row=table.insertRow(rowCount);
var colCount=table.rows[0].cells.length;
对于(变量i=0;imodel.Schedule,new{htmlAttributes=new{@class=“form control”}})
@Html.ValidationMessageFor(model=>model.Schedule,“,new{@class=“text danger”})
@EditorFor(model=>model.Room,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.Room,“,new{@class=“text danger”})
@EditorFor(model=>model.Subject,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.Subject,“,new{@class=“text danger”})
}
和控制器

public ActionResult Create()
    {
        EmployeeViewModel employeeViewModel = new EmployeeViewModel();
        ICollection<FacultySchedViewModel> schedViewModel = new List<FacultySchedViewModel>();
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(EmployeeViewModel employeeViewModel, ICollection<FacultySchedViewModel> schedViewModel)
    {
        if (ModelState.IsValid)
        {
            var emp = db.Employee.Create();
            emp.ID = employeeViewModel.ID;
            emp.LastName = employeeViewModel.LastName;
            emp.FirstName = employeeViewModel.FirstName;
            db.Employee.Add(emp);

            if (schedViewModel != null)
            {
                var sched = db.FacultySchedule.Create();
                foreach (var aaa in schedViewModel)
                {
                    sched.EmployeeID = employeeViewModel.ID;
                    sched.Schedule = aaa.Schedule;
                    sched.Room = aaa.Room;
                    sched.Subject = aaa.Subject;
                } 
            }     

            db.SaveChanges();

            return RedirectToAction("Index");
        }
public ActionResult Create()
{
EmployeeViewModel EmployeeViewModel=新的EmployeeViewModel();
ICollection schedViewModel=新列表();
返回视图();
}
[HttpPost]
[ValidateAntiForgeryToken]
公共操作结果创建(EmployeeViewModel EmployeeViewModel、ICollection schedViewModel)
{
if(ModelState.IsValid)
{
var emp=db.Employee.Create();
emp.ID=employeeViewModel.ID;
emp.LastName=employeeViewModel.LastName;
emp.FirstName=employeeViewModel.FirstName;
db.Employee.Add(环境管理计划);
if(schedViewModel!=null)
{
var sched=db.FacultySchedule.Create();
foreach(schedViewModel中的var aaa)
{
sched.EmployeeID=employeeViewModel.ID;
附表=aaa附表;
附表房间=aaa房间;
附表主体=aaa主体;
} 
}     
db.SaveChanges();
返回操作(“索引”);
}

运行创建并单击保存按钮后,
EmployeeViewModel EmployeeViewModel
有效且不为空,但
ICollection schedViewModel
null。我尝试仅使用
EmployeeViewModel EmployeeViewModel
但不知道如何保存。我以这种方式保存模型,因为存在重新设置默认值和要从其他表中提取的值。

这里没有太多意义。
EmployeeViewModel
包含
FacultySchedViewModel
集合的属性,那么为什么POST方法要为
schedViewModel
添加一个额外的参数呢方法初始化一些对象,但您从不使用它们或将它们传递给视图。您的
BeginCollectionItem()
方法在所有控件的前面加上“FacultySchedViewModel”但是你没有任何属性,叫做“代码> FulultSydVIEW模型< /COD>。我最好是想创建一个新的<代码>雇员<代码>,并且能够动态地添加<代码> FulultStays< /Cord>对象吗?是的,想要创建一个新的雇员,并且能够动态地添加FululTy时间表,我真的很困惑。我已经尝试过其他的PAR代码。tial view..有两种方法可供选择。如果在分部中使用
BeginCollectionItem
,则“添加”按钮应调用一个方法,返回分部并将其添加到DOM中(注意-删除周围的
元素-您不希望每行都有一个表)。另一种方法是克隆html模板,更新索引器并将其附加到DOM。我建议在您的情况下使用第一种方法,尽管这意味着每次添加行时都要调用服务器。
<table class="table" id="AddSchedule">
        @using (Html.BeginCollectionItem("FacultySchedViewModel"))
        {
            <tr>
                <td><input type="checkbox" name="chk[]" class="checkbox_style" /></td>
                <td>
                    @Html.HiddenFor(model => model.ID, new { htmlAttributes = new { @class = "form-control" } })
                </td>
                <td>
                    @Html.EditorFor(model => model.Schedule, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Schedule, "", new { @class = "text-danger" })
                </td>
                <td>
                    @Html.EditorFor(model => model.Room, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Room, "", new { @class = "text-danger" })
                </td>
                <td>
                    @Html.EditorFor(model => model.Subject, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Subject, "", new { @class = "text-danger" })
                </td>
            </tr>
        }
    </table>

    <div class="form-group">
        <div class="col-md-12">
            <input type="button" name="add" value="Add" class="btn btn-default" onclick="addRow('AddSchedule')">
            <input type="button" name="remove" value="Remove" class="btn btn-default" onclick="deleteRow('AddSchedule')">
        </div>
    </div>
public ActionResult Create()
    {
        EmployeeViewModel employeeViewModel = new EmployeeViewModel();
        ICollection<FacultySchedViewModel> schedViewModel = new List<FacultySchedViewModel>();
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(EmployeeViewModel employeeViewModel, ICollection<FacultySchedViewModel> schedViewModel)
    {
        if (ModelState.IsValid)
        {
            var emp = db.Employee.Create();
            emp.ID = employeeViewModel.ID;
            emp.LastName = employeeViewModel.LastName;
            emp.FirstName = employeeViewModel.FirstName;
            db.Employee.Add(emp);

            if (schedViewModel != null)
            {
                var sched = db.FacultySchedule.Create();
                foreach (var aaa in schedViewModel)
                {
                    sched.EmployeeID = employeeViewModel.ID;
                    sched.Schedule = aaa.Schedule;
                    sched.Room = aaa.Room;
                    sched.Subject = aaa.Subject;
                } 
            }     

            db.SaveChanges();

            return RedirectToAction("Index");
        }