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是的,这正是我所期待的。现在我已经通过了另一个链接,这看起来对我来说更容易