ASP.NET MVC DropDownFor Validation (значение не может быть нулевым. Имя параметра: источник) - PullRequest
1 голос
/ 01 марта 2011

Я все еще борюсь с изучением ASP.NET MVC. Все мои записи в форме являются обязательными, поэтому я хотел бы проверить их. Для краткости я связал свою модель с описанием (текстовое поле) и парадигмой (раскрывающийся список). Я включаю классы Entry.cs, Paradigm.cs и EntryViewModel.cs и представление Display.cshtml.

[Bind(Exclude = "EntryId")]
public class Entry
{
  [ScaffoldColumn(false)] 
  public int EntryId { get; set; }

  [Required(ErrorMessage = "You must include a description.")]
  public string Description { get; set; }

  [Display(Name = "Type")]
  [Required(ErrorMessage = "You must select a type.")]
  public int ParadigmId { get; set; }

  public virtual Paradigm Paradigm { get; set; }
}

public class Paradigm
{
    [ScaffoldColumn(false)]
    public int ParadigmId { get; set; }

    [Required]
    public string Name { get; set; }

    public List<Entry> Entries { get; set; } 
}

public class EntryViewModel
{
    public Entry Entry { get; set; }
    public IEnumerable<Entry> Entries { get; set; }
}

@model Pylon.Models.EntryViewModel

@{
    ViewBag.Title = "Display";
}

<hr />

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Entry</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Entry.Description)
        </div>
        <div class="editor-field">
            @Html.TextAreaFor(model => model.Entry.Description)
            @Html.ValidationMessageFor(model => model.Entry.Description)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Entry.ParadigmId)
        </div>
        <div class="editor-field">   
            @Html.DropDownListFor(model => model.Entry.ParadigmId, ((IEnumerable<Pylon.Models.Paradigm>)ViewBag.PossibleParadigms).Select(option => new SelectListItem {
                Text = (option == null ? "None" : option.Name), 
                Value = option.ParadigmId.ToString(),
                Selected = (Model != null) && (option.ParadigmId == Model.Entry.ParadigmId)
            }))
            <a href="@Url.Action("Paradigm")"><img src="../../Content/Images/add_icon.gif" /></a> 
            @Html.ValidationMessageFor(model => model.Entry.ParadigmId)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

Если я отправлю форму без ввода описания, я бы хотел, чтобы валидация добавила и сказала: «Вы должны включить описание». Однако вместо этого я получаю ArgumentNullException в строке DropDownFor. http://www.wvha.org/temp/ArgumentNullException.png

Что мне делать? Как в стороне любые приличные книги, которые охватывают ASP.NET MVC 3 / Razor. Я могу следовать основным принципам, но я сбиваюсь с пути, когда мне нужно отклониться от более продвинутых функций.

public class EntriesController : Controller
    {
        private readonly PylonContext _context = new PylonContext();

        public ActionResult Display()
        {
            // DropDown
            ViewBag.PossibleParadigms = _context.Paradigms;

            var viewModel = new EntryViewModel {Entries = _context.Entries.ToList()};
            return View(viewModel);
        }

        [HttpPost]
        public ActionResult Display(EntryViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                _context.Entries.Add(viewModel.Entry);
                _context.SaveChanges();
                return RedirectToAction("Display");
            }

            return View(viewModel);
        }
}

1 Ответ

3 голосов
/ 01 марта 2011

Трудно сказать, не видя код вашего контроллера, но похоже, что ваш ViewBag.PossibleParadigms может быть нулевым.

Ваше действие контроллера вставки / обновления выглядит примерно так?

if (ModelState.IsValid) {
    ///...
} else {
    return View(model);
}

Если это так, вам нужно поместить возможную парадигму обратно в ViewBag (так сказать), прежде чем вернуться обратно к представлению.

Если вы можете опубликовать соответствующий код действия контроллера, это будет легче узнать наверняка.

...