Asp.net Dropdownlistfor对象引用未设置为ModelState.IsValid之后的对象实例

Asp.net Dropdownlistfor对象引用未设置为ModelState.IsValid之后的对象实例,asp.net,asp.net-mvc,razor,Asp.net,Asp.net Mvc,Razor,当通过(ModelState.IsValid时,DropdownListFor出现问题。当它通过下拉列表时,会发生错误(对象引用未设置为对象的实例。) 查看 视图的此行出错 @Html.DropDownListFor(model => model.si_g_code, new= SelectList(Model.Guardian,"g_ref_code","fullname"), "Select Guardian") @Html.ValidationMessageFor(model =

当通过(
ModelState.IsValid
时,
DropdownListFor
出现问题。当它通过
下拉列表时,会发生错误(
对象引用未设置为对象的实例。

查看

视图的此行出错

 @Html.DropDownListFor(model => model.si_g_code, new= SelectList(Model.Guardian,"g_ref_code","fullname"), "Select Guardian")
 @Html.ValidationMessageFor(model => model.si_g_code)

 @Html.DropDownListFor(model => model.si_gl_id, new SelectList(Model.GradeLevel,"gl_id","gl_name"), "Select Grade Level", new { id = "ddlGrade" })
 @Html.ValidationMessageFor(model => model.si_gl_id)
控制器

    [HttpGet]
    public ActionResult RegisterStudent()
    {
        Models.ModelActions action = new Models.ModelActions();
        var model = new acgs_qm.Models.CreateStudent
        {
            GradeLevel = action.getGrade(),
            Guardian = action.getGuardian(),
            si_id = action.getStudentNum()
        };

        return View(model);
    }

    [HttpPost]
    public ActionResult RegisterStudent(CreateStudent Create)
    {
        acgs_qm.Models.ModelActions Ma = new acgs_qm.Models.ModelActions();
        if (ModelState.IsValid)
        {
            Ma.insertStudent(Create);
        }
        return View();
    }
型号

public class CreateStudent
{
    [DisplayAttribute(Name = "Student ID")]
    public string si_id { get; set; }
    [Required]
    [DisplayAttribute(Name = "First Name")]
    public string si_fname { get; set; }
    [Required]
    [DisplayAttribute(Name = "Middle Name")]
    public string si_mname { get; set; }
    [Required]
    [DisplayAttribute(Name = "Last Name")]
    public string si_lname { get; set; }
    [DataType(DataType.Text)]
    [Required]
    [DisplayAttribute(Name = "Contact Number")]
    public string si_contact_no { get; set; }
    [Required]
    [DisplayAttribute(Name = "Gender")]
    public string si_gender { get; set; }
    [Required]
    [DisplayAttribute(Name = "Civil Status")]
    public string si_civil_status { get; set; }
    [Required]
    [DisplayAttribute(Name = "Birthdate")]
    public string si_birthdate { get; set; }
    [Required]
    [DisplayAttribute(Name = "Birth Place")]
    public string si_brith_place { get; set; }
    [Required]
    [DisplayAttribute(Name = "Guardian")]
    public string si_g_code { get; set; }
    [Required]
    [DisplayAttribute(Name = "Enrolled")]
    public string si_enrolled { get; set; }
    [Required]
    [DisplayAttribute(Name = "Email")]
    public string si_email { get; set; }
    [Required]
    [DisplayAttribute(Name = "Grade Level")]
    public int si_gl_id { get; set; } //fk
    [Required]
    [DisplayAttribute(Name = "Section")]
    public int si_sec_id { get; set; } //fk

    public IEnumerable<GradeLevel> GradeLevel { get; set; }
    public IEnumerable<Guardian> Guardian { get; set; }
}

public class GradeLevel
{
    public string gl_id { get; set; }
    public string gl_roman_no { get; set; }
    public string gl_name { get; set; }
}


public class Guardian
{
    public string g_ref_code { get; set; }
    public string g_fname { get; set; }
    public string g_mname { get; set; }
    public string g_lname { get; set; }
    public string g_contact { get; set; }
    public string fullName { get; set; }
}
public类CreateStudent
{
[DisplayAttribute(Name=“学生ID”)]
公共字符串si_id{get;set;}
[必需]
[DisplayAttribute(Name=“First Name”)]
公共字符串si_fname{get;set;}
[必需]
[DisplayAttribute(Name=“Middle Name”)]
公共字符串si_mname{get;set;}
[必需]
[DisplayAttribute(Name=“Last Name”)]
公共字符串si_lname{get;set;}
[数据类型(DataType.Text)]
[必需]
[DisplayAttribute(Name=“联系人号码”)]
公共字符串si_contact_no{get;set;}
[必需]
[DisplayAttribute(Name=“Gender”)]
公共字符串si_性别{get;set;}
[必需]
[DisplayAttribute(Name=“Civil Status”)]
公共字符串si_civil_status{get;set;}
[必需]
[DisplayAttribute(Name=“Birthdate”)]
公共字符串si_birthdate{get;set;}
[必需]
[DisplayAttribute(Name=“出生地”)]
公共字符串si_brith_place{get;set;}
[必需]
[DisplayAttribute(Name=“Guardian”)]
公共字符串si_g_代码{get;set;}
[必需]
[DisplayAttribute(Name=“已注册”)]
公共字符串si_{get;set;}
[必需]
[DisplayAttribute(Name=“Email”)]
公共字符串si_电子邮件{get;set;}
[必需]
[DisplayAttribute(Name=“Grade Level”)]
公共int si_gl_id{get;set;}//fk
[必需]
[DisplayAttribute(Name=“Section”)]
public int si_secu_id{get;set;}//fk
公共IEnumerable级别{get;set;}
公共IEnumerable监护人{get;set;}
}
公营班级
{
公共字符串gl_id{get;set;}
公共字符串gl_roman_no{get;set;}
公共字符串gl_name{get;set;}
}
公共类监护人
{
公共字符串g_ref_code{get;set;}
公共字符串g_fname{get;set;}
公共字符串g_mname{get;set;}
公共字符串g_lname{get;set;}
公共字符串g_contact{get;set;}
公共字符串全名{get;set;}
}
非常感谢您的帮助:)

问题在于:

@Html.DropDownListFor(model => model.si_gl_id, new SelectList(Model.GradeLevel,"gl_id","gl_name"), "Select Grade Level", new { id = "ddlGrade" })
SelectList
将Model.GradeLevel作为参数,该参数为空 所以你必须像这样修改代码

    [HttpPost]
    public ActionResult RegisterStudent(CreateStudent Create)
    {
        acgs_qm.Models.ModelActions Ma = new acgs_qm.Models.ModelActions();
        if (ModelState.IsValid)
        {
            Ma.insertStudent(Create);
        }

        //Populate the values so that they wont be null in selectlist
        Create.GradeLevel = action.getGrade();
        Create.Guardian = action.getGuardian();

        return View(Create);
    }
因为在您的视图中,如果未选择dropdownlist,则模型字段将为空。因此,在post方法中传递给view时,显式地分配这些值,因为dropdownlist总是需要该值。 仅当模型传递给视图时,才会设置对象引用。在这段代码中,当您将Create传递给视图时,模型对象的引用被设置为Create对象的实例。 我查过了,这肯定有效。无论哪里有
Selectlist
,都必须确保传递的值不为空。为了这个目的,我正在填充

GradeLevel
Guardian
问题在于:

@Html.DropDownListFor(model => model.si_gl_id, new SelectList(Model.GradeLevel,"gl_id","gl_name"), "Select Grade Level", new { id = "ddlGrade" })
SelectList
将Model.GradeLevel作为参数,该参数为空 所以你必须像这样修改代码

    [HttpPost]
    public ActionResult RegisterStudent(CreateStudent Create)
    {
        acgs_qm.Models.ModelActions Ma = new acgs_qm.Models.ModelActions();
        if (ModelState.IsValid)
        {
            Ma.insertStudent(Create);
        }

        //Populate the values so that they wont be null in selectlist
        Create.GradeLevel = action.getGrade();
        Create.Guardian = action.getGuardian();

        return View(Create);
    }
因为在您的视图中,如果未选择dropdownlist,则模型字段将为空。因此,在post方法中传递给view时,显式地分配这些值,因为dropdownlist总是需要该值。 仅当模型传递给视图时,才会设置对象引用。在这段代码中,当您将Create传递给视图时,模型对象的引用被设置为Create对象的实例。 我查过了,这肯定有效。无论哪里有
Selectlist
,都必须确保传递的值不为空。为了这个目的,我正在填充


GradeLevel
Guardian
Http是无状态的。这意味着它不会在您的两个请求之间保留您的数据


GET
操作方法中,加载下拉列表的数据并发送到视图。但是在您的
HttpPost
操作方法中,当
ModelState.IsValid
为false时,您将返回相同的视图。但您没有将任何模型/视图模型传递给包含下拉列表数据的对象。您的razor视图正在尝试使用GradeLevel和Guardian集合来呈现下拉列表,但由于我们没有加载这些属性的数据,因此它是NULL。这就是您出现此错误的原因

您应该做的是,在返回视图之前,再次重新加载
GradeLevel
Guardian
属性值

[HttpPost]
public ActionResult RegisterStudent(CreateStudent Create)
{
    var Ma = new acgs_qm.Models.ModelActions();
    if (ModelState.IsValid)
    {
        Ma.insertStudent(Create);
    }
    //Reload the data 
    Create.GradeLevel = action.getGrade(),
    Create.Guardian = action.getGuardian(),

    return View(Create);
}

Http是无状态的。这意味着它不会在您的两个请求之间保留您的数据


GET
操作方法中,加载下拉列表的数据并发送到视图。但是在您的
HttpPost
操作方法中,当
ModelState.IsValid
为false时,您将返回相同的视图。但您没有将任何模型/视图模型传递给包含下拉列表数据的对象。您的razor视图正在尝试使用GradeLevel和Guardian集合来呈现下拉列表,但由于我们没有加载这些属性的数据,因此它是NULL。这就是您出现此错误的原因

您应该做的是,在返回视图之前,再次重新加载
GradeLevel
Guardian
属性值

[HttpPost]
public ActionResult RegisterStudent(CreateStudent Create)
{
    var Ma = new acgs_qm.Models.ModelActions();
    if (ModelState.IsValid)
    {
        Ma.insertStudent(Create);
    }
    //Reload the data 
    Create.GradeLevel = action.getGrade(),
    Create.Guardian = action.getGuardian(),

    return View(Create);
}

ModelState.IsValid
等于
false
,因此它会转到
return View()
,但您不会像在
RegisterStudent
GET方法中那样传递必要的数据!您必须再次通过使用
返回视图(Create)而不是