Reputation: 23
Im fairly new to .NET and MVC and I am trying to figure out model relations. I have 2 models, used for prebooking to seminars.
namespace App.Models{
public class PreBook{
[Key]
public int IdPreBook{get; set;}
[DataType(DataType.Date)]
public DateTime Date { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string Adress { get; set; }
public string Email { get; set; }
public string PhoneNum { get; set; }
[ForeignKey("Seminar")]
public int IdSeminar { get; set; }
public Seminar Seminar {get;set;}
}
}
.
namespace App.Models{
public class Seminar{
[Key]
public int IdSeminar {get; set;}
public string Name {get;set;}
public string Description {get;set;}
[DataType(DataType.Date)]
public DateTime Date{ get; set; }
public bool Filled { get; set; }
public List<Predbiljezba> Predbiljezbe {get; set;}
}
}
My Index view lists out all the Seminars that aren't full/filled. Index view
@model IQueryable<Seminar>
<div class="container p-3">
<div class="row pt-4">
<form asp-action="Index" method="get">
<div class="form-actions no-color">
<p>
<b>Search:</b> <input type="text" name="SearchString" value="@ViewData["CurrentFilter"]" />
<input type="submit" value="Search" class="btn btn-default" /> |
<a asp-action="Index">Back to Full List</a>
</p>
</div>
</form>
</div>
@if(Model.Count() > 0){
<table class="table table-bordered table-striped" style="width:100%">
<thead>
<tr>
<th>
</th>
<th>
Name
</th>
<th>
Description
</th>
<th>
Date
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
if(!item.Filled){
<tr>
<td class="text-center">
<a asp-controller="PreBook" asp-route-Id="@item.IdSeminar" asp-action="PreBook">Choose</a>
</td>
<td width="40%">@item.Naziv</td>
<td width="20%">@item.Opis</td>
<td width="20%">@item.Datum</td>
<!----<td width="30%"></td>---->
</tr>
}
}
</tbody>
</table>
}else{
<p>No category exists.</p>
}
This is my Prebook action called when clicking "Choose" and this is where I need help.
public IActionResult PreBook(){
ViewData["IdSeminara"] = new SelectList(_context.Seminars, "IdSeminar", "Naziv");
return View();
}
and this is post action:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult PreBook(PreBook obj)
{
if (ModelState.IsValid)
{
_context.PreBooks.Add(obj);
_context.SaveChanges();
return RedirectToAction("Index");
}
else
{
return View(obj);
}
}
and this is prebook view. PreBook View
and its code:
@model PreBook
<form method="post" asp-action="PreBook">
<div class="border p-3">
<div asp-validation-summery="ModelOnly" class="text-danger"></div>
<p></p>
<h4>I want to display chosen seminar name here</h4>
<div class="row">
<div class="col-8">
<div class="form-group row">
<div class="col-4">
<b>Name:</b>
</div>
<div class="col-8">
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<div class="col-4">
<b>Surname:</b>
</div>
<div class="col-8">
<input asp-for="Surname" class="form-controll" />
<span asp-validation-for="Surname" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<div class="col-4">
<b>Adress:</b>
</div>
<div class="col-8">
<input asp-for="Adress" class="form-controll" />
<span asp-validation-for="Adress" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<div class="col-4">
<b>Email:</b>
</div>
<div class="col-8">
<input asp-for="Email" class="form-controll" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<div class="col-4">
<b>Phonenumber:</b>
</div>
<div class="col-8">
<input asp-for="PhoneNum" class="form-controll" />
<span asp-validation-for="PhoneNum" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<input type="submit" value="Confirm" class="btn btn-primary" />
</div>
</div>
<div class="col-4">
@*Keep this empty*@
</div>
</div>
</div>
So how do I make it so when I choose the seminar I want to prebook to, send its key to PreBook view and save it as foreign key in PreBook model to DB? (I also want to display chosen seminars name in PreBook view). I've been searching for this whole day and I haven't found any clear explanation to this.
Both dotnet and ef are 5.0
Upvotes: 2
Views: 421
Reputation: 765
Try this, it should work
[Route("Prebook/Prebook/{id}")]
public IActionResult PreBook(int Id){
//Get name of seminar from id
string seminarName=_context.Seminars.Where(x=>x.Id==Id).FirstOrDefault().Name;
Seminar sem=new Seminar(){Name=seminarName,Id=Id);
Prebook pre=new Preebook(){Seminar=sem,IdSeminar=Id}
return View(pre);
}
On view you can use the following code
<div class="col-8">
<input type="hidden" value="IdSeminar" name="idSeminar"/>
<input asp-for="Seminar.Name" class="form-control" />
<span asp-validation-for="Seminar.Name" class="text-danger">
</span>
</div>
Also apply exception handling to prebook insert.
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult PreBook(PreBook obj)
{
if (ModelState.IsValid)
{
obj.Seminar=null;
try{
_context.PreBooks.Add(obj);
_context.SaveChanges();
}
catch(Exception ex)
{
Debug.Write(ex.Message);
}
return RedirectToAction("Index");
}
else
{
return View(obj);
}
}
Upvotes: 2