TwinToe
TwinToe

Reputation: 41

MVC .net Controller not receiving POST data from view

I'm trying to save data from my view to my Db but my controller is not receiving the data from the view.

If I inspect the package under the "Network" tab in chrome it is sending the POST with the correct values, but in debugging I can see that the model the controller is receiving is empty

My Controller:

public class EventController : Controller
{
    private ApplicationDbContext _context;

    public EventController()
    {
        _context = new ApplicationDbContext();
    }


    [HttpPost]
    public ActionResult Save(Event walkEvent)
    {
        _context.Event.Add(walkEvent);
        _context.SaveChanges();
        return RedirectToAction("Index", "Home");
    }
}

My view:

@model Doggie.ViewModels.EventViewModel
@{
ViewBag.Title = "Index";
}
@using (@Html.BeginForm("Save", "Event"))
{
<div class="form-group">
    @Html.LabelFor(e => e.Event.DogOwnerName)
    @Html.ValidationMessageFor(e => e.Event.DogOwnerName)
    @Html.TextBoxFor(e => e.Event.DogOwnerName, new {@class = "form-control"})
</div>
<div class="form-group">
    @Html.LabelFor(e => e.Event.Location.Name)
    @Html.ValidationMessageFor(e => e.Event.Location.Name)
    @Html.DropDownListFor(e => e.Event.LocationId, new SelectList(Model.Location, "Id", "Name"), "Select Location", new {@class = "form-control"})
</div>
<div class="form-group">
    @Html.LabelFor(e => e.Event.Date)
    @Html.ValidationMessageFor(e => e.Event.Date)
    @Html.EditorFor(e => e.Event.Date, new {htmlAttributes = new {@class = "form-control", @placeholder = "dd/mm/yyyy"}})
</div>
<div class="form-group">
    @Html.LabelFor(e => e.Event.StartingTime)
    @Html.ValidationMessageFor(e => e.Event.StartingTime)
    @Html.TextBoxFor(e => e.Event.StartingTime, new { @class = "form-control", @placeholder="hh:mm" })
</div>
<div class="form-group">
    @Html.LabelFor(e => e.Event.EstimatedTimeMinutes)
    @Html.ValidationMessageFor(e => e.Event.EstimatedTimeMinutes)
    @Html.TextBoxFor(e => e.Event.EstimatedTimeMinutes, new { @class = "form-control", @placeholder="In minutes" })
</div>
<div class="form-group">
    @Html.LabelFor(e => e.Event.Comment)
    @Html.ValidationMessageFor(e => e.Event.Comment)
    @Html.TextAreaFor(e => e.Event.Comment, new { @class = "form-control"})
</div>

@Html.HiddenFor(e => e.Event.Id)
<button type="submit" class="btn btn-primary">Save</button>
}

My EventViewModel:

public class EventViewModel
{
    public IEnumerable<Location> Location { get; set; }
    public Event Event { get; set; }
}

Upvotes: 1

Views: 403

Answers (1)

TanvirArjel
TanvirArjel

Reputation: 32069

Replace Event with EventViewModel in your Save post method parameter.

[HttpPost]
public ActionResult Save(EventViewModel walkEvent)
{
    _context.Event.Add(walkEvent.Event); // <-- Here add `Event` from `walkEvent`
    _context.SaveChanges();
    return RedirectToAction("Index", "Home");
}

Upvotes: 2

Related Questions