C# razorview DropDownListFor 'Значение не может быть нулевым'

Я новичок в ASP.NET MVC и работаю над своим первым проектом просто для удовольствия. Я получаю ArgumentNullException и не могу понять, что не так.

Это моя модель:

public class SpeciesLabel
{
    [Key]
    [Required]
    public string Name { get; set; }

    [Required]
    public CustomGroup CustomGroup { get; set; }

    [Required]
    public Family Family { get; set; }

    [Required]
    public Genus Genus { get; set; }

    [Required]
    public Species Species { get; set; }
}

public class SpeciesLabelDbContext : DbContext
{
    public SpeciesLabelDbContext()
        : base("DefaultConnection")
    {

    }

    public DbSet<SpeciesLabel> SpeciesLabel { get; set; }
}

Это контроллер:

 public ActionResult Create()
    {
        List<SelectListItem> customGroups = new List<SelectListItem>();
        IQueryable<string> customGroupsQuery = from g in customGroupsDb.CustomGroup
            select g.Name;

        foreach (var element in customGroupsQuery)
        {
            customGroups.Add(new SelectListItem()
            {
                Value = element,
                Text = element
            });
        }

        ViewBag.CustomGroup = customGroups;

Это запрос POST контроллера:

public ActionResult Create([Bind(Include = "CustomGroup,Family,Genus,Species")] SpeciesLabel speciesLabel)
    {
        if (ModelState.IsValid)
        {
            db.SpeciesLabel.Add(speciesLabel);
            db.SaveChanges();
            return RedirectToAction("Create");
        }

        return View();
    }

И это мнение:

    <pre>
        @model PlantM.Models.PlantModels.SpeciesLabel

@{
    ViewBag.Title = "Create";
}

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

    <div class="form-horizontal">
        <h4>Species label</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @Html.LabelFor(model => model.CustomGroup, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.CustomGroup, new SelectList(ViewBag.CustomGroupList, "Value", "Text"), "Please select...", new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.CustomGroup, "", new { @class = "text-danger" })
            </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>
}
</pre>

У меня есть входные данные для всех свойств в представлении, но я сократил их, поскольку они похожи на это, и исключение будет таким же. Только свойство Name не возвращается из представления, так как оно будет спроектировано в контроллере (объединение других свойств).

Это исключение, которое я получаю при отправке формы:

ArgumentNullException

Редактировать:

После добавления инициализации ViewBag в метод POST Create проблема с ArgumentNullException решена, но я все еще получаю аргументы со значением Null, и объект не может быть создан из-за этого, а представление Create вызывается снова и снова!? Кто-нибудь может посоветовать, почему эти @Html.DropDownListFor не публикуют значения в контроллере?

1 ответ

Решение

Из комментария звучит так, будто вы видите вид при первом посещении, но после публикации возникает пустое исключение.

Если приведенное выше предположение верно, то я думаю, что ваша проблема в том, что когда вы отправляете обратно, ваша модель не прошла проверку (например, возможно, в обязательном поле ввода не было отправлено обратно значение), что означает ModelState.IsValid ложно, так return View() назывался

Вот проблема, вы не устанавливаете ViewBag.CustomGroup = customGroups; в до возвращения, следовательно, ViewBag.CustomGroup имеет значение null, поэтому вы видите исключение.

инициализируйте ViewBag, например, как вы это сделали на get, тогда вы сможете увидеть страницу.

Другие вопросы по тегам