2013-08-05 2 views
1

может кто-нибудь подумать, почему я не получаю желаемый результат, когда я нажимаю ссылку на детали? я получаю ошибку: The model item passed into the dictionary is of type 'System.Collections.Generic.List1[AW_Internet.Models.ProdList]', but this dictionary requires a model item of type 'AW_Internet.Models.ProdList'.MVC 4 Детали страницы разобраны 2 id's

Контроллер:

public ActionResult Details(int id1 = 0, int id2 = 0) 
{ 
    string test = "SELECT SalesLT.Product.ProductID, SalesLT.ProductDescription.ProductDescriptionID, SalesLT.Product.Name, SalesLT.Product.ListPrice, LEFT(SalesLT.ProductDescription.Description, 20) as Descrption FROM SalesLT.Product, SalesLT.ProductDescription, SalesLT.ProductModelProductDescription WHERE SalesLT.Product.ProductModelID = SalesLT.ProductModelProductDescription.ProductModelID AND SalesLT.ProductModelProductDescription.ProductDescriptionID = SalesLT.ProductDescription.ProductDescriptionID AND SalesLT.Product.ProductID = " + id1 + " AND SalesLT.ProductDescription.ProductDescriptionID = " + id2; 
    var viewModel = db.Database.SqlQuery<ProdList>(test).ToList(); 
    if (viewModel == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(viewModel);   
} 

ViewModel:

public class ProdList 
    { 
     public int ProductID { get; set; } 
     public int ProductDescriptionID { get; set; } 
     public string Name { get; set; } 
     public decimal ListPrice { get; set; } 
     public string Description { get; set; } 
    } 

Подробнее Вид:

@model AW_Internet.Models.ProdList 

@{ 
    ViewBag.Title = "Details"; 
} 

<h2>Prod Details</h2> 

<div class="displayField"> 
    @Html.DisplayFor(model => model.ProductID) 
</div> 
<div class="displayField"> 
    @Html.DisplayFor(model => model.ProductDescriptionID) 
</div> 
<div class="displayField"> 
    @Html.DisplayFor(model => model.Name) 
</div> 
<div class="displayField"> 
    @Html.DisplayFor(model => model.ListPrice) 
</div> 
<div class="displayField"> 
    @Html.DisplayFor(model => model.Description) 
</div> 

<p> 
    @Html.ActionLink("Back to List", "Index") 
</p> 

И фрагмент из моего индекса с будучи двумя идентификаторами разобран:

<td> 
    @Html.ActionLink("Details", "Details", new { id1 = item.ProductID, id2 item.ProductDescriptionID }) 
</td> 

ответ

4

Если вы ожидаете несколько ProdList возвращенные детали из вашего запроса, то обновите вид:

@model List<AW_Internet.Models.ProdList> 

и обновления, как вы ссылки все на ваш взгляд. Это более вероятно, что вы пытаетесь вернуть одну запись, так что вы должны написать:

ProdList prodList = db.Database.SqlQuery<ProdList>(test).FirstOrDefault(); 

и вы, вероятно, хотите обновить свой метод, а также, так как он никогда не будет равна null, где вы проверка, и если бы это было так, то это вызвало бы исключение, если вы это сделали .ToList() '.

public ActionResult Details(int id1 = 0, int id2 = 0) 
{ 
    string test = "..."; 

    var viewModel = db.Database.SqlQuery<ProdList>(test).ToList(); 

    if (!viewModel.Any()) 
     return HttpNotFound(); 

    return View(viewModel);   
} 

или более вероятный сценарий, где вы хотите только 1 запись:

public ActionResult Details(int id1 = 0, int id2 = 0) 
{ 
    string test = "..."; 

    ProdList prodList = db.Database.SqlQuery<ProdList>(test).FirstOrDefault(); 

    if (prodList == null) 
     return HttpNotFound(); 

    return View(prodList);   
} 

Может быть, попробовать обновить имена переменных, а также - :)

3

По вашему способу, вы вернули List<ProdList>, и, на ваш взгляд, вы объявляете ProdList. Вы должны вернуть один элемент, как это:

public ActionResult Details(int id1 = 0, int id2 = 0) 
{ 
    string test = "SELECT SalesLT.Product.ProductID, SalesLT.ProductDescription.ProductDescriptionID, SalesLT.Product.Name, SalesLT.Product.ListPrice, LEFT(SalesLT.ProductDescription.Description, 20) as Descrption FROM SalesLT.Product, SalesLT.ProductDescription, SalesLT.ProductModelProductDescription WHERE SalesLT.Product.ProductModelID = SalesLT.ProductModelProductDescription.ProductModelID AND SalesLT.ProductModelProductDescription.ProductDescriptionID = SalesLT.ProductDescription.ProductDescriptionID AND SalesLT.Product.ProductID = " + id1 + " AND SalesLT.ProductDescription.ProductDescriptionID = " + id2; 

    var viewModel = db.Database.SqlQuery<ProdList>(test).ToList(); 
    if (viewModel == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(viewModel.First());   
} 

Надеется, что это помогает

+0

Это решило его спасибо! Будет ли это такой же способ для редактирования результата действия? Просто перейдя к опросу запроса к обновлению – Chris

+0

Вы должны вернуться на ту же модель, что и на вашем представлении. На вашем примере вы вернули «Список », и вы просматриваете использование 'ProdList' –

2

db.Database.SqlQuery<ProdList>(test) возвращает коллекцию и ваша страница ожидает один элемента. Вы можете сделать:

var viewModel = db.Database.SqlQuery<ProdList>(test).FirstOrDefault(); 
if (viewModel == null) 
{ 
    return HttpNotFound(); 
} 
return View(viewModel));