Asp Net Core - Entity Framework - ViewBag - Related Data - CRUD

时间:2017-08-05 11:14:40

标签: entity-framework asp.net-core-mvc viewbag

I am creating a simple Location and Country relationship and i have been able to link the to tables and i am able to pull the related data, the issue is that when i try post the form the database does not update with the ID of the country.

When monitoring the POST action via Firefox Developer tools i can see the ID of the country is being posted.

LocationsController

public class LocationsController : Controller
{
    private readonly DataContext _context;

    public LocationsController(DataContext context)
    {
        _context = context;    
    } 
    // DropDown: Populate the Dropdown lists
    private void PopulateCountryDropDownList(object selectedCountry = null)
    {
        var countriesQuery = from c in _context.Countries
                             orderby c.CountryID
                             select c;
        ViewBag.CountryID = new SelectList(countriesQuery.AsNoTracking(), "CountryID", "Title");
    }
    // GET: Locations/Create
    public IActionResult Create()
    {
        PopulateCountryDropDownList();
        return View();
    }

    // POST: Locations/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(Location location)
    {
        if (ModelState.IsValid)
        {
            _context.Add(location);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        return View(location);
    }  
}

Location

using System.ComponentModel.DataAnnotations;

namespace RaceCaribbean.Models
{
    public class Location
    {
        public int LocationID { get; set; }
        public string Title { get; set; }            
        public Country Country { get; set; }

    }
}

Country

using System.ComponentModel.DataAnnotations;

namespace RaceCaribbean.Models
{
    public class Country
    {
        public int CountryID { get; set; }
        [Required]
        public string Title { get; set; }
        [Required]
        public string Code { get; set; }
    }
}

Create.cshtml

@model RaceCaribbean.Models.Location

@{
    ViewData["Title"] = "Create";
}

<h2>Create</h2>

<form asp-action="Create">
    <div class="form-horizontal">
        <h4>Location</h4>
        <hr />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Title" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Title" class="form-control" />
                <span asp-validation-for="Title" class="text-danger"></span>
            </div>
        </div>            

        <div class="form-group">
            <label asp-for="Country" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <select asp-for="Country" class="form-control" asp-items="ViewBag.CountryID">
                    <option selected="selected" value="">-- Select Country --</option>
                </select>
                <span asp-validation-for="Country" 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>
</form>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

0 个答案:

没有答案