Как передать один-ко-многим из контроллера для просмотра в mvc4
Итак, это будет после изменений, с которыми вы, ребята, помогли мне, я предполагаю, что я где-то получаю синтаксическую ошибку
Посмотреть
@model OilNGasWeb.ModelData.Clients
@{
ViewBag.Title = "Index";
}
<h2>County's for </h2>
<p>
@Html.ActionLink("Create New", "Create",new { id = Model.ClientID },null)
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.County)
</th>
<th>
@Html.DisplayNameFor(model => model.Note)
</th>
<th>
@Html.DisplayNameFor(model => model.Comment)
</th>
</tr>
@foreach (var item in Model.Countys) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.County)
</td>
<td>
@Html.DisplayFor(modelItem => item.Note)
</td>
<td>
@Html.DisplayFor(modelItem => item.Comment)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.CountyID })
@Html.ActionLink("Details", "Details", new { id=item.CountyID })
@Html.ActionLink("Delete", "Delete", new { id=item.CountyID })
</td>
</tr>
}
</table>
Клиенты модели
[Table("Clients")]
public class Clients
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ClientID { get; set; }
public string Client { get; set; }
public string Address { get; set; }
public string State { get; set; }
public string City { get; set; }
public string County { get; set; }
public int Zip { get; set; }
public string Phone { get; set; }
public string LogoLocation { get; set; }
public string ContactName { get; set; }
public string ContactPhone { get; set; }
public string ContactEmail { get; set; }
public int Authorized { get; set; }
public string Note { get; set; }
public string Comment { get; set; }
public virtual ICollection<Countys> Countys { get; set; }
}
Модель Граф
[Table("Countys")]
public class Countys
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int CountyID { get; set; }
public int ClientID { get; set; }
public string County { get; set; }
public string Note { get; set; }
public string Comment { get; set; }
public virtual ICollection<TownShips> Townships { get; set; }
}
Графический контроллер
public ActionResult Index(int id)
{
var cnty = from r in db.Clients
where r.ClientID == id
select r;
if (cnty != null)
{
return View(cnty); // View returns an error here
}
return HttpNotFound();
View возвращает ошибку, но я не могу зайти в нее... чтобы выяснить, что это... идеи?
2 ответа
Судя по всему, данные, необходимые представлению, находятся на другом уровне, чем то, что передается. Вы отправляете IEnumerable<Countys>
на вид. Но, как вы спросите, что происходит, когда перечисление пусто? Где представление может получить другие части данных, которые ему нужны? (В этом случае ClientID
.)
Что на самом деле нужно, так это Clients
, Потому что он ищет кусок Clients
данные, а именно ClientID
, Конечно, эти данные также существуют на Countys
объекты, но это не имеет значения для концептуальной природы самих данных. Представление в этом случае показывает информацию о Clients
объект. В частности:
int ClientID
IEnumerable<Countys> Countys
Если последнее из этих двух не пусто, то первое можно определить непосредственно по этим данным. Это может также отличаться от совершенно разных и не связанных данных. Но дело в том, что точка зрения концептуально действует на Clients
уровень, а не на IEnumerable<Countys>
уровень.
Таким образом, вы соответственно измените представление и передадите ему нужный объект:
public ActionResult Index(int id)
{
var client = (from r in db.Clients
where r.ClientID == id
select r).SingleOrDefault();
if (client != null)
return View(client);
return HttpNotFound();
}
По причинам расширяемости вам следует создавать ViewModels, которые не являются частью вашей доменной модели, и передавать их практически во все виды.
Посмотреть модель:
public class IndexViewModel
{
public int ClientID { get; set; }
public IEnumerable<Clients> Clients { get; set; }
}
Просмотр (.cshtml):
@model OilNGasWeb.Models.Home.IndexViewModel
@{
ViewBag.Title = "Index";
}
<h2>County's for </h2>
<p>
// send a ClientID with this action link
@Html.ActionLink("Create New", "Create", new { clientid = Model.ClientID } )
</p>
//... etc
Я также рекомендовал бы указать ваши переменные. Все это компилируется, поэтому обычно лучше писать поддерживаемый код вместо коротких переменных.
контроллер
public ActionResult Index(int id)
{
//Lambda (just for an example, there is nothing wrong with LINQ expressions)
var client = db.Clients
.FirstOrDefault(c => c.ClientID == id);
if (client != null)
{
var model = new IndexViewModel();
model.ClientID = id;
model.Clients = // some value I don't understand
// My preference/opinion (programming religion) is to prefix with this
// so others know if the method is *this* class, *base* class etc
return this.View(model);
}
return HttpNotFound();
}