문제

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>
도움이 되었습니까?

해결책

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);
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top