I am trying to display two 2 tables in one View. I don't want to display it as a list but to detail, and most tutorials I get a lists view.
I tried the following video: https://youtu.be/oN1f2Vpc-wU
Now the issue I have is that when I click the link to open a details page for ViewModel, it shows null.
Model 1
[Table("UserRegistration")]
public partial class UserRegistration
{
[Key]
public Guid ClientId { get; set; }
[StringLength(50)]
public string FirstName { get; set; }
[StringLength(50)]
public string LastName { get; set; }
[StringLength(50)]
public string IdentityNumber { get; set; }
[StringLength(50)]
public string PhoneNumber { get; set; }
public string Password { get; set; }
public string ConfirmPassword { get; set; }
[Column(TypeName = "date")]
public DateTime? DateCreated { get; set; }
}
Model 2
[Table("Voucher")]
public partial class Voucher
{
public int VoucherId { get; set; }
public Guid? CustomerId { get; set; }
[StringLength(50)]
public string HouseNumber { get; set; }
[StringLength(50)]
public string PostalCode { get; set; }
[StringLength(50)]
public string Location { get; set; }
[Column(TypeName = "date")]
public DateTime? DateCreated { get; set; }
}
ViewModel
public class ViewModel
{
public Guid? CustomerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string IdentityNumber { get; set; }
public string HouseNumber { get; set; }
public string PostalCode { get; set; }
public string Location { get; set; }
}
Controller UserRegistration
private mymodel db = new mymodel();
// GET: UserRegistrations
public ActionResult Index()
{
return View(db.UserRegistrations.ToList());
}
Controller Home
private mymodel db = new mymodel();
// GET: Home
public ActionResult Index(Guid id)
{
//
UserRegistration ur = db.UserRegistrations.Single(x => x.ClientId == id);
Voucher voucher = new Voucher();
ViewModel viewm = new ViewModel();
ur.FirstName = viewm.FirstName;
ur.LastName = viewm.LastName;
voucher.HouseNumber = viewm.HouseNumber;
voucher.Location = viewm.Location;
voucher.PostalCode = viewm.PostalCode;
return View(viewm);
}
Index.cshtml
@model ExampleTestMVC.Models.ViewModel
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<div>
<h4>UserRegistration</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.FirstName)
</dt>
<dd>
@Html.DisplayFor(model => model.FirstName)
</dd>
<dt>
@Html.DisplayNameFor(model => model.LastName)
</dt>
<dd>
@Html.DisplayFor(model => model.LastName)
</dd>
<dt>
@Html.DisplayNameFor(model => model.HouseNumber)
</dt>
<dd>
@Html.DisplayFor(model => model.Location)
</dd>
<dt>
@Html.DisplayNameFor(model => model.PostalCode)
</dt>
<dd>
@Html.DisplayFor(model => model.PostalCode)
</dd>
</dl>
Index.chtml for UserRegistration
@model IEnumerable<ExampleTestMVC.Models.UserRegistration>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.FirstName)
</th>
<th>
@Html.DisplayNameFor(model => model.LastName)
</th>
<th>
@Html.DisplayNameFor(model => model.IdentityNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.PhoneNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.Password)
</th>
<th>
@Html.DisplayNameFor(model => model.ConfirmPassword)
</th>
<th>
@Html.DisplayNameFor(model => model.DateCreated)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.IdentityNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.PhoneNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.Password)
</td>
<td>
@Html.DisplayFor(modelItem => item.ConfirmPassword)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateCreated)
</td>
<td>
@Html.ActionLink("details of everything", "Index", "Home", new { id = item.ClientId }, null) |
</td>
</tr>
}
</table>
CodePudding user response:
You are not setting value to viewmodel which is bind with detail view. Change the Home controller code like this :
public ActionResult Index(Guid id)
{
//
UserRegistration ur = db.UserRegistrations.Single(x => x.ClientId == id);
Voucher voucher = db.Vouchers.Single(x => x.CustomerId == id);
ViewModel viewm = new ViewModel();
viewm.FirstName=ur.FirstName;
viewm.LastName=ur.LastName;
viewm.HouseNumber=voucher.HouseNumber;
viewm.Location=voucher.Location;
viewm.PostalCode=voucher.PostalCode;
return View(viewm);
}