Html 使用下拉菜单创建或编辑操作时转储

Html 使用下拉菜单创建或编辑操作时转储,html,asp.net,asp.net-mvc,asp.net-mvc-4,razor,Html,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Razor,我已经创建/生成了这个非常简单的MVC程序(1分钟),步骤如下 1.创建MVC5 asp程序并创建新的模型类-测试模型 2.转到控制器add->scaffold并提供模型和上下文类 crud操作已生成,一切正常 我现在想要的是,当用户在性别下拉列表中点击create时,他可以选择,我写的代码来自上一篇文章,我在html下拉列表中得到了转储,我缺少什么 模型 using System.Collections.Generic; using System.Data.Entity; using Syst

我已经创建/生成了这个非常简单的MVC程序(1分钟),步骤如下 1.创建MVC5 asp程序并创建新的模型类-测试模型 2.转到控制器add->scaffold并提供模型和上下文类

crud操作已生成,一切正常 我现在想要的是,当用户在性别下拉列表中点击create时,他可以选择,我写的代码来自上一篇文章,我在html下拉列表中得到了转储,我缺少什么

模型

using System.Collections.Generic;
using System.Data.Entity;
using System.Web.Mvc;

namespace TestropDownCreate.Models
{
    public class TestModel
    {
        public int ID { get; set; }
        public string Name { get; set; }

        public string SelectedGender { get; set; }

        public IEnumerable<SelectListItem> Gender
        {
            get
            {
                return new[]
            {
                new SelectListItem {Value = "M", Text = "Male"},
                new SelectListItem {Value = "F", Text = "Female"}
            };
            }
        }
    }

        public class TestModelDBContext : DbContext
        {
            public DbSet<TestModel> TestModel { get; set; }
        }



}
使用System.Collections.Generic;
使用System.Data.Entity;
使用System.Web.Mvc;
命名空间TestropDownCreate.Models
{
公共类测试模型
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串SelectedGender{get;set;}
公共数字性别
{
得到
{
返回新的[]
{
新建SelectListItem{Value=“M”,Text=“Male”},
新建SelectListItem{Value=“F”,Text=“Female”}
};
}
}
}
公共类TestModelDBContext:DbContext
{
公共DbSet TestModel{get;set;}
}
}
通过scaffold生成的视图,您可以看到我对生成的代码进行了注释,并将 @Html.dropdownlist导致转储的原因,我应该如何解决它

@model TestropDownCreate.Models.TestModel

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>


@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>TestModel</h4>
        <hr />
        @Html.ValidationSummary(true)

        <div class="form-group">
            @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name)
                @Html.ValidationMessageFor(model => model.Name)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.SelectedGender, new { @class = "control-label col-md-2" })
            <div class="col-md-10">

                @Html.DropDownListFor(model => model.SelectedGender, Model.Gender)
                @*@Html.EditorFor(model => model.SelectedGender)
                @Html.ValidationMessageFor(model => model.SelectedGender)*@
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
@model TestropDownCreate.Models.TestModel
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
测试模型

@Html.ValidationSummary(true) @LabelFor(model=>model.Name,新的{@class=“controllabel col-md-2”}) @EditorFor(model=>model.Name) @Html.ValidationMessageFor(model=>model.Name) @LabelFor(model=>model.SelectedGender,新的{@class=“controllabel col-md-2”}) @Html.DropDownListFor(model=>model.SelectedGender,model.Gender) @*@EditorFor(model=>model.SelectedGender) @Html.ValidationMessageFor(model=>model.SelectedGender)*@ } @ActionLink(“返回列表”、“索引”) @节脚本{ @Scripts.Render(“~/bundles/jqueryval”) }
根据经验,我会提出一个大胆的建议,您将获得一个
ArgumentNullException
异常,因为
SelectedGender
的值尚未设置。所以,这里发生的是

@Html.DropDownListFor(model => model.SelectedGender, Model.Gender)
asp.net正在尝试使用某个值预先选择dropdownlist,为此,它查看
SelectedGender
的值,并尝试将其与
Gender
中提供的任何值进行匹配,但是,
SelectedGender
没有设置,因为它为空。现在,要解决这个问题,您可以采用两种方法:

  • 使用与
    Gender
    中指定的值之一匹配的默认值初始化
    SelectedGender
    …M或F

  • 使用伪默认值(如空字符串)初始化
    SelectedGender
    ,然后向
    Gender
    添加默认值,如下所示

    public IEnumerable<SelectListItem> Gender
    {
        get
        {
            return new[]
        {
            new SelectListItem {Value = "", Text = "--Select a gender--"},
            new SelectListItem {Value = "M", Text = "Male"},
            new SelectListItem {Value = "F", Text = "Female"}
        };
        }
    }
    
    公共IEnumerable性别
    {
    得到
    {
    返回新的[]
    {
    新建SelectListItem{Value=”“,Text=“--选择性别--”},
    新建SelectListItem{Value=“M”,Text=“Male”},
    新建SelectListItem{Value=“F”,Text=“Female”}
    };
    }
    }
    

  • 正如Jhoon在评论中指出的建议,您实际上不需要在数据库中保留性别值,但我理解这超出了您的问题范围

    转储是什么意思?你说的是内存转储吗?@Leo-不,转储是空引用,为什么你在数据库中存储男性和女性?最好的方法是对它们使用Enum。您也可以为它们创建表。@JhoonBey-您能提供一个示例,说明我应该如何存储它们吗?也许这会导致问题……嗨,Leo投票支持您的帮助。。对不起,我的回复延迟了,第一个建议你能举例说明我应该在哪里定义它吗?第二个建议我尝试了,我得到了同样的结果(我只是添加了第一行选择性别…我错过了什么吗?顺便说一句,你建议在其他地方使用性别定义,请让我知道在哪里?我对这个话题非常陌生。。。