使用“下拉”进行创建或编辑操作时转储

时间:2014-04-04 06:16:40

标签: html asp.net asp.net-mvc asp.net-mvc-4 razor

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

生成了crud操作,一切正常 我现在想要的是,用户点击性别中的创建他将有下拉列表,他可以选择,我写这个代码,我从上一篇文章,我得到转储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; }
        }



}

通过scaffold生成的视图,你可以看到我评论生成的代码并放入 @ Html.DropDownListFor导致转储,我应该如何解决它。

@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")
}

1 个答案:

答案 0 :(得分:0)

我会根据您获得ArgumentNullException例外的经验提出一个大胆的建议,因为SelectedGender的值尚未设置。所以,正在发生的事情就是......

@Html.DropDownListFor(model => model.SelectedGender, Model.Gender)

asp.net尝试预先选择具有某些值的下拉列表,为此,它会查看SelectedGender的值并尝试将其与Gender中提供的任何值进行匹配但是,SelectedGender没有设置任何内容,因为它为空。现在,要解决此问题,您可以采用以下两种方法:

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

  2. 使用虚拟默认值(例如空字符串)初始化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"}
        };
        }
    }
    
  3. Jhoon在评论中指出你没有真正需要在数据库中保留性别价值的建议,但我知道这不属于你的问题范围