Pergunta

I'm completely new to ASP MVC, so sorry if I'm asking something stupid.

The ModelState won't get validated. It says venue.VenueType.Type is null. Am I doing this right? I'm already giving a value to Type in the controller (don't know if this is best practice), but the ModelState doesn't recognise this.

I've read about using TryUpdateModel. This didn't lead to any succes, although I'm not sure I was using it right.

Should I use a ViewModel for this? Which fields do I use in that?

These are the two models:

public class Venue
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public virtual VenueType VenueType { get; set; }
    public virtual ICollection<VisitInfo> VisitInfos { get; set; }
}

public class VenueType
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Type { get; set; }
}

A create action for the Venue class:

    //
    // GET: /Venue/Create

    public ActionResult Create()
    {
        ViewBag.venueTypes = new SelectList(context.VenueTypes, "Id", "Type");
        return View();
    } 

    //
    // POST: /Venue/Create

    [HttpPost]
    public ActionResult Create(Venue venue)
    {
        venue.VenueType = context.VenueTypes.Find(venue.VenueType.Id);

        ViewBag.venueTypes = new SelectList(context.VenueTypes, "Id", "Type");

        if (ModelState.IsValid)
        {
            context.Venues.Add(venue);
            context.SaveChanges();
            return RedirectToAction("Index");  
        }
        return View(venue);
    }

And a create view:

@model eBouncer_Web.Models.Venue

@* This partial view defines form fields that will appear when creating and editing entities *@
<div class="editor-label">
    @Html.LabelFor(model => model.VenueType)
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.VenueType.Id, (SelectList) ViewBag.venueTypes)
</div>

<div class="editor-label">
    @Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Name)
    @Html.ValidationMessageFor(model => model.Name)
</div>
Foi útil?

Solução

If you write your own validations you don't need ModelState.

 [HttpPost]
    public ActionResult Create(Venue venue)
    {
        venue.VenueType = context.VenueTypes.Find(venue.VenueType.Id);

        ViewBag.venueTypes = new SelectList(context.VenueTypes, "Id", "Type");

        if (Venue != null && Venue.Name != null)//etc.. or other validations get here...
        {
            context.Venues.Add(venue);
            context.SaveChanges();
            return RedirectToAction("Index");  
        }
        return View(venue);
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top