Javascript 如何以动态形式使用模型

Javascript 如何以动态形式使用模型,javascript,c#,jquery,asp.net-mvc,forms,Javascript,C#,Jquery,Asp.net Mvc,Forms,场景: public class StudentModel { [Required] public string Name { get; set; } public string Grade { get; set; } public string Tutor { get; set; } public List<SubjectModel> Subjects { get; set; } }

场景:

 public class StudentModel
    {
        [Required]
        public string Name { get; set; }
        public string Grade { get; set; }
        public string Tutor { get; set; }
        public List<SubjectModel> Subjects { get; set; }
    }

    public class SubjectModel
    {
        [Required]
        public string Subject { get; set; }
    }
 public class HomeController : Controller
    {
        ....

        [HttpPost]
        public ActionResult Index(StudentModel stu)
        {            
            if (ModelState.IsValid)
            {
                //db operations
                return RedirectToAction("Index");
            }
            return View(stu);
        }
        public ActionResult Subjects(int count)
        {
            ViewBag.count = count;
            return PartialView("SubjectPV");
        }
@{
    ViewBag.Title = "Index";
}
@model DynamicModelForm.Models.StudentModel
<div class="jumbotron">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <div class="row">
            <div class="col-sm-3">
                <label for="Name">Name</label>
                @*<input type="text" id="Name" name="Name" />*@
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name)
            </div>
            <div class="col-sm-3">
                <label for="Grade">Grade</label>
                @*<input type="text" id="Grade" name="Grade" />*@
                @Html.TextBoxFor(x => x.Grade)
            </div>
            <div class="col-sm-3">
                <label for="Tutor">Tutor</label>
                @*<input type="text" id="Tutor" name="Tutor" />*@
                @Html.TextBoxFor(x => x.Tutor)
            </div>
            <div class="col-sm-1">
                <a class="btn btn-primary" id="addSubject">Add Subject</a>
            </div>
            <div class="col-sm-1">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </div>
        <div id="subjectInfo" style="padding-top:10px;">
            @{
                if (Model.Subjects != null)
                {
                    var count = 0;
                    foreach (var sub in Model.Subjects)
                    {
                        <div class='row'>
                            <div class='col-sm-8'>
                                <label for="Subject_@count">Subject @count</label>
                                @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
                                <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count" value="@sub.Subject" />
                                @Html.ValidationMessageFor(x => x.Subjects[count].Subject)                                
                            </div>
                        </div>
                        count++;
                    }
                }
            }
        </div>
                }
</div>

<script type="text/javascript">
    //var count = 0;
    $("#addSubject").click(function () {
        var count = $('.SubjectsSubject').length
        $.ajax({
            url: '@Url.Action("Subjects","Home")' + "?count=" + count,
            success: function (result) {
                $("#subjectInfo").append(result);
                //count++;
            },
            error: function (req, status, error) {
                alert(error);
            }
        });
    });
</script>
@model DynamicModelForm.Models.SubjectModel

    <div class='row'>
        @{
            var count = ViewBag.count;
        }
        <div class='col-sm-8'>
            <label for="Subject_@count">Subject @count</label>
            @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
            <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count"/>
            @Html.ValidationMessageFor(x => x.Subject)
            @*<span class="field-validation-valid" data-valmsg-for="Subjects[@count].Subject" data-valmsg-replace="true"></span>*@
        </div>
    </div>
用户可以输入其姓名、年级和导师姓名。然后需要输入科目分数。主题表单字段是动态的,换句话说,一个用户可能有5个主题,而另一个用户可能只有3个

当前修复:

 public class StudentModel
    {
        [Required]
        public string Name { get; set; }
        public string Grade { get; set; }
        public string Tutor { get; set; }
        public List<SubjectModel> Subjects { get; set; }
    }

    public class SubjectModel
    {
        [Required]
        public string Subject { get; set; }
    }
 public class HomeController : Controller
    {
        ....

        [HttpPost]
        public ActionResult Index(StudentModel stu)
        {            
            if (ModelState.IsValid)
            {
                //db operations
                return RedirectToAction("Index");
            }
            return View(stu);
        }
        public ActionResult Subjects(int count)
        {
            ViewBag.count = count;
            return PartialView("SubjectPV");
        }
@{
    ViewBag.Title = "Index";
}
@model DynamicModelForm.Models.StudentModel
<div class="jumbotron">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <div class="row">
            <div class="col-sm-3">
                <label for="Name">Name</label>
                @*<input type="text" id="Name" name="Name" />*@
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name)
            </div>
            <div class="col-sm-3">
                <label for="Grade">Grade</label>
                @*<input type="text" id="Grade" name="Grade" />*@
                @Html.TextBoxFor(x => x.Grade)
            </div>
            <div class="col-sm-3">
                <label for="Tutor">Tutor</label>
                @*<input type="text" id="Tutor" name="Tutor" />*@
                @Html.TextBoxFor(x => x.Tutor)
            </div>
            <div class="col-sm-1">
                <a class="btn btn-primary" id="addSubject">Add Subject</a>
            </div>
            <div class="col-sm-1">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </div>
        <div id="subjectInfo" style="padding-top:10px;">
            @{
                if (Model.Subjects != null)
                {
                    var count = 0;
                    foreach (var sub in Model.Subjects)
                    {
                        <div class='row'>
                            <div class='col-sm-8'>
                                <label for="Subject_@count">Subject @count</label>
                                @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
                                <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count" value="@sub.Subject" />
                                @Html.ValidationMessageFor(x => x.Subjects[count].Subject)                                
                            </div>
                        </div>
                        count++;
                    }
                }
            }
        </div>
                }
</div>

<script type="text/javascript">
    //var count = 0;
    $("#addSubject").click(function () {
        var count = $('.SubjectsSubject').length
        $.ajax({
            url: '@Url.Action("Subjects","Home")' + "?count=" + count,
            success: function (result) {
                $("#subjectInfo").append(result);
                //count++;
            },
            error: function (req, status, error) {
                alert(error);
            }
        });
    });
</script>
@model DynamicModelForm.Models.SubjectModel

    <div class='row'>
        @{
            var count = ViewBag.count;
        }
        <div class='col-sm-8'>
            <label for="Subject_@count">Subject @count</label>
            @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
            <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count"/>
            @Html.ValidationMessageFor(x => x.Subject)
            @*<span class="field-validation-valid" data-valmsg-for="Subjects[@count].Subject" data-valmsg-replace="true"></span>*@
        </div>
    </div>
目前,我已经通过使用jQuery的
append
on button click事件,用意大利面条代码解决了这个问题。并将表单数据作为FormCollection传递,然后将FormCollection更改为model

我需要什么:

 public class StudentModel
    {
        [Required]
        public string Name { get; set; }
        public string Grade { get; set; }
        public string Tutor { get; set; }
        public List<SubjectModel> Subjects { get; set; }
    }

    public class SubjectModel
    {
        [Required]
        public string Subject { get; set; }
    }
 public class HomeController : Controller
    {
        ....

        [HttpPost]
        public ActionResult Index(StudentModel stu)
        {            
            if (ModelState.IsValid)
            {
                //db operations
                return RedirectToAction("Index");
            }
            return View(stu);
        }
        public ActionResult Subjects(int count)
        {
            ViewBag.count = count;
            return PartialView("SubjectPV");
        }
@{
    ViewBag.Title = "Index";
}
@model DynamicModelForm.Models.StudentModel
<div class="jumbotron">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <div class="row">
            <div class="col-sm-3">
                <label for="Name">Name</label>
                @*<input type="text" id="Name" name="Name" />*@
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name)
            </div>
            <div class="col-sm-3">
                <label for="Grade">Grade</label>
                @*<input type="text" id="Grade" name="Grade" />*@
                @Html.TextBoxFor(x => x.Grade)
            </div>
            <div class="col-sm-3">
                <label for="Tutor">Tutor</label>
                @*<input type="text" id="Tutor" name="Tutor" />*@
                @Html.TextBoxFor(x => x.Tutor)
            </div>
            <div class="col-sm-1">
                <a class="btn btn-primary" id="addSubject">Add Subject</a>
            </div>
            <div class="col-sm-1">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </div>
        <div id="subjectInfo" style="padding-top:10px;">
            @{
                if (Model.Subjects != null)
                {
                    var count = 0;
                    foreach (var sub in Model.Subjects)
                    {
                        <div class='row'>
                            <div class='col-sm-8'>
                                <label for="Subject_@count">Subject @count</label>
                                @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
                                <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count" value="@sub.Subject" />
                                @Html.ValidationMessageFor(x => x.Subjects[count].Subject)                                
                            </div>
                        </div>
                        count++;
                    }
                }
            }
        </div>
                }
</div>

<script type="text/javascript">
    //var count = 0;
    $("#addSubject").click(function () {
        var count = $('.SubjectsSubject').length
        $.ajax({
            url: '@Url.Action("Subjects","Home")' + "?count=" + count,
            success: function (result) {
                $("#subjectInfo").append(result);
                //count++;
            },
            error: function (req, status, error) {
                alert(error);
            }
        });
    });
</script>
@model DynamicModelForm.Models.SubjectModel

    <div class='row'>
        @{
            var count = ViewBag.count;
        }
        <div class='col-sm-8'>
            <label for="Subject_@count">Subject @count</label>
            @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
            <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count"/>
            @Html.ValidationMessageFor(x => x.Subject)
            @*<span class="field-validation-valid" data-valmsg-for="Subjects[@count].Subject" data-valmsg-replace="true"></span>*@
        </div>
    </div>
我需要使用模型而不是表单集合。也就是说,我需要将表单数据作为model而不是formcollection传递

以下是我所做的:

 public class StudentModel
    {
        [Required]
        public string Name { get; set; }
        public string Grade { get; set; }
        public string Tutor { get; set; }
        public List<SubjectModel> Subjects { get; set; }
    }

    public class SubjectModel
    {
        [Required]
        public string Subject { get; set; }
    }
 public class HomeController : Controller
    {
        ....

        [HttpPost]
        public ActionResult Index(StudentModel stu)
        {            
            if (ModelState.IsValid)
            {
                //db operations
                return RedirectToAction("Index");
            }
            return View(stu);
        }
        public ActionResult Subjects(int count)
        {
            ViewBag.count = count;
            return PartialView("SubjectPV");
        }
@{
    ViewBag.Title = "Index";
}
@model DynamicModelForm.Models.StudentModel
<div class="jumbotron">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <div class="row">
            <div class="col-sm-3">
                <label for="Name">Name</label>
                @*<input type="text" id="Name" name="Name" />*@
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name)
            </div>
            <div class="col-sm-3">
                <label for="Grade">Grade</label>
                @*<input type="text" id="Grade" name="Grade" />*@
                @Html.TextBoxFor(x => x.Grade)
            </div>
            <div class="col-sm-3">
                <label for="Tutor">Tutor</label>
                @*<input type="text" id="Tutor" name="Tutor" />*@
                @Html.TextBoxFor(x => x.Tutor)
            </div>
            <div class="col-sm-1">
                <a class="btn btn-primary" id="addSubject">Add Subject</a>
            </div>
            <div class="col-sm-1">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </div>
        <div id="subjectInfo" style="padding-top:10px;">
            @{
                if (Model.Subjects != null)
                {
                    var count = 0;
                    foreach (var sub in Model.Subjects)
                    {
                        <div class='row'>
                            <div class='col-sm-8'>
                                <label for="Subject_@count">Subject @count</label>
                                @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
                                <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count" value="@sub.Subject" />
                                @Html.ValidationMessageFor(x => x.Subjects[count].Subject)                                
                            </div>
                        </div>
                        count++;
                    }
                }
            }
        </div>
                }
</div>

<script type="text/javascript">
    //var count = 0;
    $("#addSubject").click(function () {
        var count = $('.SubjectsSubject').length
        $.ajax({
            url: '@Url.Action("Subjects","Home")' + "?count=" + count,
            success: function (result) {
                $("#subjectInfo").append(result);
                //count++;
            },
            error: function (req, status, error) {
                alert(error);
            }
        });
    });
</script>
@model DynamicModelForm.Models.SubjectModel

    <div class='row'>
        @{
            var count = ViewBag.count;
        }
        <div class='col-sm-8'>
            <label for="Subject_@count">Subject @count</label>
            @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
            <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count"/>
            @Html.ValidationMessageFor(x => x.Subject)
            @*<span class="field-validation-valid" data-valmsg-for="Subjects[@count].Subject" data-valmsg-replace="true"></span>*@
        </div>
    </div>
型号:

 public class StudentModel
    {
        [Required]
        public string Name { get; set; }
        public string Grade { get; set; }
        public string Tutor { get; set; }
        public List<SubjectModel> Subjects { get; set; }
    }

    public class SubjectModel
    {
        [Required]
        public string Subject { get; set; }
    }
 public class HomeController : Controller
    {
        ....

        [HttpPost]
        public ActionResult Index(StudentModel stu)
        {            
            if (ModelState.IsValid)
            {
                //db operations
                return RedirectToAction("Index");
            }
            return View(stu);
        }
        public ActionResult Subjects(int count)
        {
            ViewBag.count = count;
            return PartialView("SubjectPV");
        }
@{
    ViewBag.Title = "Index";
}
@model DynamicModelForm.Models.StudentModel
<div class="jumbotron">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <div class="row">
            <div class="col-sm-3">
                <label for="Name">Name</label>
                @*<input type="text" id="Name" name="Name" />*@
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name)
            </div>
            <div class="col-sm-3">
                <label for="Grade">Grade</label>
                @*<input type="text" id="Grade" name="Grade" />*@
                @Html.TextBoxFor(x => x.Grade)
            </div>
            <div class="col-sm-3">
                <label for="Tutor">Tutor</label>
                @*<input type="text" id="Tutor" name="Tutor" />*@
                @Html.TextBoxFor(x => x.Tutor)
            </div>
            <div class="col-sm-1">
                <a class="btn btn-primary" id="addSubject">Add Subject</a>
            </div>
            <div class="col-sm-1">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </div>
        <div id="subjectInfo" style="padding-top:10px;">
            @{
                if (Model.Subjects != null)
                {
                    var count = 0;
                    foreach (var sub in Model.Subjects)
                    {
                        <div class='row'>
                            <div class='col-sm-8'>
                                <label for="Subject_@count">Subject @count</label>
                                @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
                                <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count" value="@sub.Subject" />
                                @Html.ValidationMessageFor(x => x.Subjects[count].Subject)                                
                            </div>
                        </div>
                        count++;
                    }
                }
            }
        </div>
                }
</div>

<script type="text/javascript">
    //var count = 0;
    $("#addSubject").click(function () {
        var count = $('.SubjectsSubject').length
        $.ajax({
            url: '@Url.Action("Subjects","Home")' + "?count=" + count,
            success: function (result) {
                $("#subjectInfo").append(result);
                //count++;
            },
            error: function (req, status, error) {
                alert(error);
            }
        });
    });
</script>
@model DynamicModelForm.Models.SubjectModel

    <div class='row'>
        @{
            var count = ViewBag.count;
        }
        <div class='col-sm-8'>
            <label for="Subject_@count">Subject @count</label>
            @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
            <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count"/>
            @Html.ValidationMessageFor(x => x.Subject)
            @*<span class="field-validation-valid" data-valmsg-for="Subjects[@count].Subject" data-valmsg-replace="true"></span>*@
        </div>
    </div>
公共课堂学生模型
{
公共字符串名称{get;set;}
公共字符串等级{get;set;}
公共字符串{get;set;}
公共列表主题{get;set;}
}
公共类主体模型
{
公共字符串主题{get;set;}
}
控制器:

 public class StudentModel
    {
        [Required]
        public string Name { get; set; }
        public string Grade { get; set; }
        public string Tutor { get; set; }
        public List<SubjectModel> Subjects { get; set; }
    }

    public class SubjectModel
    {
        [Required]
        public string Subject { get; set; }
    }
 public class HomeController : Controller
    {
        ....

        [HttpPost]
        public ActionResult Index(StudentModel stu)
        {            
            if (ModelState.IsValid)
            {
                //db operations
                return RedirectToAction("Index");
            }
            return View(stu);
        }
        public ActionResult Subjects(int count)
        {
            ViewBag.count = count;
            return PartialView("SubjectPV");
        }
@{
    ViewBag.Title = "Index";
}
@model DynamicModelForm.Models.StudentModel
<div class="jumbotron">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <div class="row">
            <div class="col-sm-3">
                <label for="Name">Name</label>
                @*<input type="text" id="Name" name="Name" />*@
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name)
            </div>
            <div class="col-sm-3">
                <label for="Grade">Grade</label>
                @*<input type="text" id="Grade" name="Grade" />*@
                @Html.TextBoxFor(x => x.Grade)
            </div>
            <div class="col-sm-3">
                <label for="Tutor">Tutor</label>
                @*<input type="text" id="Tutor" name="Tutor" />*@
                @Html.TextBoxFor(x => x.Tutor)
            </div>
            <div class="col-sm-1">
                <a class="btn btn-primary" id="addSubject">Add Subject</a>
            </div>
            <div class="col-sm-1">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </div>
        <div id="subjectInfo" style="padding-top:10px;">
            @{
                if (Model.Subjects != null)
                {
                    var count = 0;
                    foreach (var sub in Model.Subjects)
                    {
                        <div class='row'>
                            <div class='col-sm-8'>
                                <label for="Subject_@count">Subject @count</label>
                                @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
                                <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count" value="@sub.Subject" />
                                @Html.ValidationMessageFor(x => x.Subjects[count].Subject)                                
                            </div>
                        </div>
                        count++;
                    }
                }
            }
        </div>
                }
</div>

<script type="text/javascript">
    //var count = 0;
    $("#addSubject").click(function () {
        var count = $('.SubjectsSubject').length
        $.ajax({
            url: '@Url.Action("Subjects","Home")' + "?count=" + count,
            success: function (result) {
                $("#subjectInfo").append(result);
                //count++;
            },
            error: function (req, status, error) {
                alert(error);
            }
        });
    });
</script>
@model DynamicModelForm.Models.SubjectModel

    <div class='row'>
        @{
            var count = ViewBag.count;
        }
        <div class='col-sm-8'>
            <label for="Subject_@count">Subject @count</label>
            @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
            <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count"/>
            @Html.ValidationMessageFor(x => x.Subject)
            @*<span class="field-validation-valid" data-valmsg-for="Subjects[@count].Subject" data-valmsg-replace="true"></span>*@
        </div>
    </div>
公共类HomeController:控制器
{
....
[HttpPost]
公共行动结果索引(FormCollection表单)
{
var subjects=形式[“Subject”]。拆分(',');
var modelsubjects=新列表();
foreach(科目中的var科目)
{
添加(新SubjectModel(){Subject=Subject});
}
var模型=新的StudentModel();
model.Name=form[“Name”];
模型等级=表格[“等级”];
model.Tutor=表格[“Tutor”];
模型受试者=模型受试者;
//这里,我从一个动态表单中获取模型
返回视图();
}
}
查看:

 public class StudentModel
    {
        [Required]
        public string Name { get; set; }
        public string Grade { get; set; }
        public string Tutor { get; set; }
        public List<SubjectModel> Subjects { get; set; }
    }

    public class SubjectModel
    {
        [Required]
        public string Subject { get; set; }
    }
 public class HomeController : Controller
    {
        ....

        [HttpPost]
        public ActionResult Index(StudentModel stu)
        {            
            if (ModelState.IsValid)
            {
                //db operations
                return RedirectToAction("Index");
            }
            return View(stu);
        }
        public ActionResult Subjects(int count)
        {
            ViewBag.count = count;
            return PartialView("SubjectPV");
        }
@{
    ViewBag.Title = "Index";
}
@model DynamicModelForm.Models.StudentModel
<div class="jumbotron">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <div class="row">
            <div class="col-sm-3">
                <label for="Name">Name</label>
                @*<input type="text" id="Name" name="Name" />*@
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name)
            </div>
            <div class="col-sm-3">
                <label for="Grade">Grade</label>
                @*<input type="text" id="Grade" name="Grade" />*@
                @Html.TextBoxFor(x => x.Grade)
            </div>
            <div class="col-sm-3">
                <label for="Tutor">Tutor</label>
                @*<input type="text" id="Tutor" name="Tutor" />*@
                @Html.TextBoxFor(x => x.Tutor)
            </div>
            <div class="col-sm-1">
                <a class="btn btn-primary" id="addSubject">Add Subject</a>
            </div>
            <div class="col-sm-1">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </div>
        <div id="subjectInfo" style="padding-top:10px;">
            @{
                if (Model.Subjects != null)
                {
                    var count = 0;
                    foreach (var sub in Model.Subjects)
                    {
                        <div class='row'>
                            <div class='col-sm-8'>
                                <label for="Subject_@count">Subject @count</label>
                                @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
                                <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count" value="@sub.Subject" />
                                @Html.ValidationMessageFor(x => x.Subjects[count].Subject)                                
                            </div>
                        </div>
                        count++;
                    }
                }
            }
        </div>
                }
</div>

<script type="text/javascript">
    //var count = 0;
    $("#addSubject").click(function () {
        var count = $('.SubjectsSubject').length
        $.ajax({
            url: '@Url.Action("Subjects","Home")' + "?count=" + count,
            success: function (result) {
                $("#subjectInfo").append(result);
                //count++;
            },
            error: function (req, status, error) {
                alert(error);
            }
        });
    });
</script>
@model DynamicModelForm.Models.SubjectModel

    <div class='row'>
        @{
            var count = ViewBag.count;
        }
        <div class='col-sm-8'>
            <label for="Subject_@count">Subject @count</label>
            @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
            <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count"/>
            @Html.ValidationMessageFor(x => x.Subject)
            @*<span class="field-validation-valid" data-valmsg-for="Subjects[@count].Subject" data-valmsg-replace="true"></span>*@
        </div>
    </div>

@使用(Html.BeginForm(“Index”,“Home”,FormMethod.Post))
{
名称
等级
家教
添加主题
}
var计数=0;
$(“#添加主题”)。单击(函数(){
$(“#主题信息”)。附加(“”+
"" +
“主题”+计数+“”+
"" +
"" +
"");
计数++;
});

任何建议都会有帮助。谢谢。

因为
SubjectModel
只包含一个简单属性,所以如果您只使用包含属性
列表主题的视图模型,然后您只需要输入`

public class StudentVM
{
    public string Name { get; set; }
    public string Grade { get; set; }
    public string Tutor { get; set; }
    public List<string> Subjects { get; set; }
}
如果
SubjectModel
包含多个属性,则需要使用名称前缀和索引器生成输入(请参阅一些选项)

旁注:您应该使用强类型
HtmlHelper
方法生成输入,以便获得正确的双向模型绑定以及客户端和服务器端验证

@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)

我想你期待这个解决方案

型号:

 public class StudentModel
    {
        [Required]
        public string Name { get; set; }
        public string Grade { get; set; }
        public string Tutor { get; set; }
        public List<SubjectModel> Subjects { get; set; }
    }

    public class SubjectModel
    {
        [Required]
        public string Subject { get; set; }
    }
 public class HomeController : Controller
    {
        ....

        [HttpPost]
        public ActionResult Index(StudentModel stu)
        {            
            if (ModelState.IsValid)
            {
                //db operations
                return RedirectToAction("Index");
            }
            return View(stu);
        }
        public ActionResult Subjects(int count)
        {
            ViewBag.count = count;
            return PartialView("SubjectPV");
        }
@{
    ViewBag.Title = "Index";
}
@model DynamicModelForm.Models.StudentModel
<div class="jumbotron">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <div class="row">
            <div class="col-sm-3">
                <label for="Name">Name</label>
                @*<input type="text" id="Name" name="Name" />*@
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name)
            </div>
            <div class="col-sm-3">
                <label for="Grade">Grade</label>
                @*<input type="text" id="Grade" name="Grade" />*@
                @Html.TextBoxFor(x => x.Grade)
            </div>
            <div class="col-sm-3">
                <label for="Tutor">Tutor</label>
                @*<input type="text" id="Tutor" name="Tutor" />*@
                @Html.TextBoxFor(x => x.Tutor)
            </div>
            <div class="col-sm-1">
                <a class="btn btn-primary" id="addSubject">Add Subject</a>
            </div>
            <div class="col-sm-1">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </div>
        <div id="subjectInfo" style="padding-top:10px;">
            @{
                if (Model.Subjects != null)
                {
                    var count = 0;
                    foreach (var sub in Model.Subjects)
                    {
                        <div class='row'>
                            <div class='col-sm-8'>
                                <label for="Subject_@count">Subject @count</label>
                                @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
                                <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count" value="@sub.Subject" />
                                @Html.ValidationMessageFor(x => x.Subjects[count].Subject)                                
                            </div>
                        </div>
                        count++;
                    }
                }
            }
        </div>
                }
</div>

<script type="text/javascript">
    //var count = 0;
    $("#addSubject").click(function () {
        var count = $('.SubjectsSubject').length
        $.ajax({
            url: '@Url.Action("Subjects","Home")' + "?count=" + count,
            success: function (result) {
                $("#subjectInfo").append(result);
                //count++;
            },
            error: function (req, status, error) {
                alert(error);
            }
        });
    });
</script>
@model DynamicModelForm.Models.SubjectModel

    <div class='row'>
        @{
            var count = ViewBag.count;
        }
        <div class='col-sm-8'>
            <label for="Subject_@count">Subject @count</label>
            @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
            <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count"/>
            @Html.ValidationMessageFor(x => x.Subject)
            @*<span class="field-validation-valid" data-valmsg-for="Subjects[@count].Subject" data-valmsg-replace="true"></span>*@
        </div>
    </div>
查看:

 public class StudentModel
    {
        [Required]
        public string Name { get; set; }
        public string Grade { get; set; }
        public string Tutor { get; set; }
        public List<SubjectModel> Subjects { get; set; }
    }

    public class SubjectModel
    {
        [Required]
        public string Subject { get; set; }
    }
 public class HomeController : Controller
    {
        ....

        [HttpPost]
        public ActionResult Index(StudentModel stu)
        {            
            if (ModelState.IsValid)
            {
                //db operations
                return RedirectToAction("Index");
            }
            return View(stu);
        }
        public ActionResult Subjects(int count)
        {
            ViewBag.count = count;
            return PartialView("SubjectPV");
        }
@{
    ViewBag.Title = "Index";
}
@model DynamicModelForm.Models.StudentModel
<div class="jumbotron">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <div class="row">
            <div class="col-sm-3">
                <label for="Name">Name</label>
                @*<input type="text" id="Name" name="Name" />*@
                @Html.TextBoxFor(x => x.Name)
                @Html.ValidationMessageFor(x => x.Name)
            </div>
            <div class="col-sm-3">
                <label for="Grade">Grade</label>
                @*<input type="text" id="Grade" name="Grade" />*@
                @Html.TextBoxFor(x => x.Grade)
            </div>
            <div class="col-sm-3">
                <label for="Tutor">Tutor</label>
                @*<input type="text" id="Tutor" name="Tutor" />*@
                @Html.TextBoxFor(x => x.Tutor)
            </div>
            <div class="col-sm-1">
                <a class="btn btn-primary" id="addSubject">Add Subject</a>
            </div>
            <div class="col-sm-1">
                <input class="btn btn-primary" type="submit" value="Submit" />
            </div>
        </div>
        <div id="subjectInfo" style="padding-top:10px;">
            @{
                if (Model.Subjects != null)
                {
                    var count = 0;
                    foreach (var sub in Model.Subjects)
                    {
                        <div class='row'>
                            <div class='col-sm-8'>
                                <label for="Subject_@count">Subject @count</label>
                                @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
                                <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count" value="@sub.Subject" />
                                @Html.ValidationMessageFor(x => x.Subjects[count].Subject)                                
                            </div>
                        </div>
                        count++;
                    }
                }
            }
        </div>
                }
</div>

<script type="text/javascript">
    //var count = 0;
    $("#addSubject").click(function () {
        var count = $('.SubjectsSubject').length
        $.ajax({
            url: '@Url.Action("Subjects","Home")' + "?count=" + count,
            success: function (result) {
                $("#subjectInfo").append(result);
                //count++;
            },
            error: function (req, status, error) {
                alert(error);
            }
        });
    });
</script>
@model DynamicModelForm.Models.SubjectModel

    <div class='row'>
        @{
            var count = ViewBag.count;
        }
        <div class='col-sm-8'>
            <label for="Subject_@count">Subject @count</label>
            @*@Html.TextBoxFor(x => x.Subject, new { id = "subject_" + count })*@
            <input type="text" class="SubjectsSubject" name="Subjects[@count].Subject" id="subject_@count"/>
            @Html.ValidationMessageFor(x => x.Subject)
            @*<span class="field-validation-valid" data-valmsg-for="Subjects[@count].Subject" data-valmsg-replace="true"></span>*@
        </div>
    </div>
@{
ViewBag.Title=“Index”;
}
@模型动态ModelForm.Models.StudentModel
@使用(Html.BeginForm(“Index”,“Home”,FormMethod.Post))
{
名称
@**@
@Html.TextBoxFor(x=>x.Name)
@Html.ValidationMessageFor(x=>x.Name)
等级
@**@
@Html.TextBoxFor(x=>x.Grade)
家教
@**@
@Html.TextBoxFor(x=>x.Tutor)

谢谢你的回复。有没有办法只使用
StudentModel
而不使用
StudentVM
?@Stephen Muecke我想OP想知道如何将动态生成的字段绑定到模型中的
列表
。前提是你的控件有
name=“Subjects[0].Subject”
name=“Subjects[1].Subject”
等(索引器必须从零开始,并且是连续的)。但是您不应该在视图中使用数据模型,尤其是在编辑时irrelevant@Mairaj,Oops-忘记添加链接:)但在这种情况下,这样做是疯狂的trouble@StephenMuecke是的,这正是我所期待的。现在我已经通过了另一个链接,这看起来对我来说更容易