复合模型不绑定 mvc 3
Composite model not binding mvc 3
我创建了两个模型,Student 和 School,以及一个复合模型 StudentSchool。我正在使用两个不同的部分视图来创建一个学生和另一个学校。但是,在我的控制器中,我得到了学生和学校的空值。下面是我的代码:
学生:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LayoutProject.Models
{
public class Student
{
public int studentID { get; set; }
public String firstname { get; set; }
public String lastname { get; set; }
public int year { get; set; }
}
}
学校:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LayoutProject.Models
{
public class School
{
public int schoolID { get; set; }
public String name { get; set; }
public String add { get; set; }
}
}
复合模型,StudentSchool:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LayoutProject.Models
{
public class StudentSchool
{
public Student student { get; set; }
public School school { get; set; }
}
}
PartielViewStudent:
@model LayoutProject.Models.Student
<h4>Student</h4>
@Html.LabelFor(d=>d.studentID) : @Html.TextBoxFor(d=>d.studentID)
<br />
@Html.LabelFor(d=>d.firstname) : @Html.TextBoxFor(d=>d.firstname)
<br />
@Html.LabelFor(d=>d.lastname) : @Html.TextBoxFor(d=>d.lastname)
<br />
@Html.LabelFor(d=>d.year) : @Html.TextBoxFor(d=>d.year)
<br />
PartialViewSchool:
@model LayoutProject.Models.School
<h4>School</h4>
@Html.LabelFor(d=>d.schoolID) : @Html.TextBoxFor(d=>d.schoolID)
<br />
@Html.LabelFor(d=>d.name) : @Html.TextBoxFor(d=>d.name)
<br />
@Html.LabelFor(d=>d.add) : @Html.TextBoxFor(d=>d.add)
<br />
观点:
@{
ViewBag.Title = "StudentSchool";
}
<h2>StudentSchool</h2>
<form action="/Home/CreateStudentSchools" method="post">
@using (Html.BeginForm())
{
@Html.Partial("_PartialViewStudent")
@Html.Partial("_PartialViewSchool")
}
<input id="createSD" type="submit" value="Submit"/>
</form>
控制器:
[HttpPost]
public ActionResult CreateStudentSchools(StudentSchool ss)
{
return View("CreateStudentSchool");
}
知道我在这里可能遗漏了什么吗?从 4 天开始就一直在使用它。
将您的 'partial' 视图移至 /Views/Shared/EditorTemplates
文件夹并将它们分别重命名为 Student.cshtml
和 School.cshtml
(以匹配 类 的名称) .然后在主视图中使用
@using (Html.BeginForm())
{
@Html.EditorFor(m => m.Student)
@Html.EditorFor(m => m.School)
}
您生成的输入现在将包含用于绑定到您的视图模型的正确 name
属性,例如 name="Student.studentID"
而不是当前的 name="studentID"
注意:作为替代方法,您可以将 HtmlFieldPrefix 传递给 Partial,如 中所示。
如果您提供两个具有不同模型的局部视图并合并为一个视图,这不是一个好主意model.You必须将复合模型的引用传递给您的局部视图。
@using (Html.BeginForm())
{
@Html.Partial("_PartialViewStudent",Model.student)
@Html.Partial("_PartialViewSchool",Model.school)
}
这与此方法一样工作正常,因为表单中的所有内容都是严格键入的。
在部分视图中,您还必须将模型指定为
@model LayoutProject.Models.StudentSchool.student
@model LayoutProject.Models.StudentSchool.school
我不确定你的 [httpget] 创建方法,但它应该是这样的
[HttpGet]
public ActionResult CreateStudentSchools(StudentSchool ss)
{
var studentsc=new StudentSchool()
{
student=new Student(),
school=new School()
}
return View("CreateStudentSchool",studentsc);
}
我创建了两个模型,Student 和 School,以及一个复合模型 StudentSchool。我正在使用两个不同的部分视图来创建一个学生和另一个学校。但是,在我的控制器中,我得到了学生和学校的空值。下面是我的代码:
学生:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LayoutProject.Models
{
public class Student
{
public int studentID { get; set; }
public String firstname { get; set; }
public String lastname { get; set; }
public int year { get; set; }
}
}
学校:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LayoutProject.Models
{
public class School
{
public int schoolID { get; set; }
public String name { get; set; }
public String add { get; set; }
}
}
复合模型,StudentSchool:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace LayoutProject.Models
{
public class StudentSchool
{
public Student student { get; set; }
public School school { get; set; }
}
}
PartielViewStudent:
@model LayoutProject.Models.Student
<h4>Student</h4>
@Html.LabelFor(d=>d.studentID) : @Html.TextBoxFor(d=>d.studentID)
<br />
@Html.LabelFor(d=>d.firstname) : @Html.TextBoxFor(d=>d.firstname)
<br />
@Html.LabelFor(d=>d.lastname) : @Html.TextBoxFor(d=>d.lastname)
<br />
@Html.LabelFor(d=>d.year) : @Html.TextBoxFor(d=>d.year)
<br />
PartialViewSchool:
@model LayoutProject.Models.School
<h4>School</h4>
@Html.LabelFor(d=>d.schoolID) : @Html.TextBoxFor(d=>d.schoolID)
<br />
@Html.LabelFor(d=>d.name) : @Html.TextBoxFor(d=>d.name)
<br />
@Html.LabelFor(d=>d.add) : @Html.TextBoxFor(d=>d.add)
<br />
观点:
@{
ViewBag.Title = "StudentSchool";
}
<h2>StudentSchool</h2>
<form action="/Home/CreateStudentSchools" method="post">
@using (Html.BeginForm())
{
@Html.Partial("_PartialViewStudent")
@Html.Partial("_PartialViewSchool")
}
<input id="createSD" type="submit" value="Submit"/>
</form>
控制器:
[HttpPost]
public ActionResult CreateStudentSchools(StudentSchool ss)
{
return View("CreateStudentSchool");
}
知道我在这里可能遗漏了什么吗?从 4 天开始就一直在使用它。
将您的 'partial' 视图移至 /Views/Shared/EditorTemplates
文件夹并将它们分别重命名为 Student.cshtml
和 School.cshtml
(以匹配 类 的名称) .然后在主视图中使用
@using (Html.BeginForm())
{
@Html.EditorFor(m => m.Student)
@Html.EditorFor(m => m.School)
}
您生成的输入现在将包含用于绑定到您的视图模型的正确 name
属性,例如 name="Student.studentID"
而不是当前的 name="studentID"
注意:作为替代方法,您可以将 HtmlFieldPrefix 传递给 Partial,如
如果您提供两个具有不同模型的局部视图并合并为一个视图,这不是一个好主意model.You必须将复合模型的引用传递给您的局部视图。
@using (Html.BeginForm())
{
@Html.Partial("_PartialViewStudent",Model.student)
@Html.Partial("_PartialViewSchool",Model.school)
}
这与此方法一样工作正常,因为表单中的所有内容都是严格键入的。
在部分视图中,您还必须将模型指定为
@model LayoutProject.Models.StudentSchool.student
@model LayoutProject.Models.StudentSchool.school
我不确定你的 [httpget] 创建方法,但它应该是这样的
[HttpGet]
public ActionResult CreateStudentSchools(StudentSchool ss)
{
var studentsc=new StudentSchool()
{
student=new Student(),
school=new School()
}
return View("CreateStudentSchool",studentsc);
}