2016-02-15 6 views
0

У меня есть вид страницы MachineInfo который я показываю 60 различных спецификаций соответствующей машины, как процессор информации, барана информация, информация на диске, дб информации и т.д.Фильтрация по параметру & Routing

ActionLink на этой странице :

@Html.ActionLink("Machine Info", "MachineInfo", new { id = Model.LicenseKey }) | 

контроллер:

public ActionResult MachineInfo(string LicenseKey) 
    { 
     if (LicenseKey == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Farm farm = db.Farms.Find(LicenseKey); 
     if (farm == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(farm); 
    } 

Farm Модель:

public partial class Farm 
{ 
    public Farm() 
    { 
     this.FarmChanges = new HashSet<FarmChange>(); 
     this.FarmDetails = new HashSet<FarmDetail>(); 
     this.FarmTables = new HashSet<FarmTable>(); 
    } 

    public int Id { get; set; } 
    public string LicenseKey { get; set; } 
    public string Name { get; set; } 
    public string CustomerName { get; set; } 

    public virtual ICollection<FarmChange> FarmChanges { get; set; } 
    public virtual ICollection<FarmDetail> FarmDetails { get; set; } 
    public virtual ICollection<FarmTable> FarmTables { get; set; } 
} 

FarmDetails Модель:

public partial class FarmDetail 
{ 
    public System.Guid Id { get; set; } 
    public int FarmId { get; set; } 
    public int Type { get; set; } 
    public string Name { get; set; } 
    public string Value { get; set; } 

    public virtual Farm Farm { get; set; } 
} 

Все MachineInfo исходит от "Value" в таблице FarmDetails.

Вид:

@model IEnumerable<FarmManagement.Models.FarmDetail> 

@{ 
    ViewBag.Title = "Machine Info"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Machine Info</h2> 

<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Type) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Value) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Farm.LicenseKey) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Type) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Value) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Farm.LicenseKey) 
     </td> 
     <td> 
     </td> 
    </tr> 
} 
</table> 
@Html.ActionLink("Back to Farms List", "Index") 

Я пытаюсь показать MachineInfo конкретной машины (LicenseKey = ABXYZ-XYZAB) с этим URL: mydomain.com/MachineInfo/ABXYZ-XYZAB

Мне нужно фильтр вид LicenseKey.

После моих всех попыток, я получаю только 400 - Bad Ошибка запроса (Поскольку LicenseKey == NULL) или получить MachineInfo из ВСЕ машины, а не конкретная машина с LicenseKey = ABXYZ-XYZAB.

Что я делаю неправильно?

+1

вместо 'общественного ActionResult MachineInfo (строка LicenseKey)' 'использовать общественный ActionResult MachineInfo (строка идентификатор)' .... 'LicenseKey' всегда будет нулевым, потому что вы ничего в ней не устанавливать ... –

+0

@Kartikeya дает ошибку: элемент модели, переданный в словарь, имеет тип «System.Data.Entity.DynamicProxies.Farm_BDB4A56137C4065DC20A78957B4843D725D3B41972D06982AC6CA0308623C051», но для этого словаря требуется элемент модели типа «System.Collections.Generic.IEnumerable'1 [ FarmManagement.v2.Models.FarmDetail] ' –

ответ

0

решена проблема после внесения следующих изменений:

Новый контроллер После изменения:

public ActionResult MachineInfo(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      FarmDetail farmdetail = db.FarmDetails.Where(x => x.FarmId == id).FirstOrDefault(); 
      if (farmdetail == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(farmdetail); 
     } 

New View После изменения:

@model FarmManagement.Models.FarmDetail 

@{ 
    ViewBag.Title = "Machine Info"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Machine Info</h2> 

<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Type) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Value) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Farm.LicenseKey) 
     </th> 
     <th></th> 
    </tr> 

@for (int i = 0; i < Model.Farm.FarmDetails.Count(); i++) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(model => model.Farm.FarmDetails.ElementAt(i).Type) 
     </td> 
     <td> 
      @Html.DisplayFor(model => model.Farm.FarmDetails.ElementAt(i).Name) 
     </td> 
     <td> 
      @Html.DisplayFor(model => model.Farm.FarmDetails.ElementAt(i).Value) 
     </td> 
     <td> 
      @Html.DisplayFor(model => model.Farm.LicenseKey) 
     </td> 
     <td> 
    </tr> 
} 
</table> 
@Html.ActionLink("Back to Farms List", "Index") 

мне нужно использовать Where предложение в Контроллере;

FarmDetail farmdetail = db.FarmDetails.Where(x => x.FarmId == id).FirstOrDefault(); 

И удалили IEnumerable от просмотра и изменил @foreach в @for с ElementAt (I).

@Html.DisplayFor(model => model.Farm.FarmDetails.ElementAt(i).Name) 
0

Изменить код ActionLink

@Html.ActionLink("Machine Info", "MachineInfo", new { id = Model.LicenseKey }) 

в

@Html.ActionLink("Machine Info", "MachineInfo", new { LicenseKey = Model.LicenseKey })

Как имя параметра ссылка Действие должно совпадать с именем параметра действия контроллера.

+1

Это сделает url '.../MachineInfo? LicenseKey = ABXYZ-XYZAB' вместо' .../MachineInfo/ABXYZ-XYZAB', если ОП не создаст собственное определение маршрута. –

+0

@StephenMuecke вы абсолютно спот на. – shu

+0

@shu это еще одна ошибка: элемент модели, переданный в словарь, имеет тип «System.Data.Entity.DynamicProxies.Farm_BDB4A56137C4065DC20A78957B4843D725D3B41972D06982AC6CA0308623C051», но для этого словаря требуется элемент модели типа «System.Collections.Generic.IEnumerable'1 [FarmManagement.Models.FarmDetail] ' –

Смежные вопросы