2014-09-18 78 views
0

我對MVC 5 .NET的世界感到陌生......我試圖從Ignite UI開始探索樹控制。傳遞模型數據以在MVC中查看5

我需要從我的模型找回我的數據,並把它傳遞給我的看法......不過,我不斷收到以下錯誤:

The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery 1[System.String]', but this dictionary requires a model item of type 'System.Linq.IQueryable 1[DataViewer.Models.Viewer]'.

這裏是我的模型:

namespace DataViewer.Models 
{ 
    [Table("dbo.table")] 
    public class Viewer 
    { 
     [Key, Column(Order=0)] public long id { get; set; } 
     public int Revision { get; set; } 
     public string GeoPSRType { get; set; } 
     public string GeoName { get; set; } 
     public string L2Name { get; set; } 
     public string L3Name { get; set; } 
    } 
} 

我的控制器:

namespace DataViewer.Controllers 
{ 
    public class ViewerController : Controller 
    { 
     private ViewerDBContext db = new ViewerDBContext(); 

     public ActionResult Index() 
     { 
      var result = db.Items.Select(i => i.GeoName).Distinct().OrderBy(n => n); 

      return View(result); 
     } 
    } 
} 

而我的觀點:

@model IQueryable<DataViewer.Models.Viewer> 

@using Infragistics.Web.Mvc 

@(Html.Infragistics().Tree() 
     .DataSource(Model) 
     .Bindings(b => 
      b.TextKey("GeoName") 
      .PrimaryKey("ID") 
      .ValueKey("ID") 
      .ChildDataProperty("L2PSRType") 
      ) 
     ) 
     .DataSource(Model) 
     .LoadOnDemand(true) 
     .DataSourceUrl(Url.Action("tree-data-on-demand")) 
     .DataBind() 
     .Render() 
) 

我想通的問題是,我應該用

IQueryable<Viewer> result = 
db.Items.Select(i => i.GeoName).Distinct().OrderBy(n => n); 

路過一個強類型的返回類型,但拋出不同的錯誤:

InvalidOperationException: The model item passed into the dictionary is of type 
'System.Data.Entity.Infrastructure.DbQuery`1[System.String]', 
but this dictionary requires a model item of type 
'System.Linq.IQueryable<DataViewer.Models.Viewer>.' 
An explicit conversion exists, are you missing a cast? 

這是關於我在強類型語法上很生鏽的事實,還是我只是一個總的栗色(或是它的組合)?

P.S.另外,我毫不懷疑視圖的Infragistics()。Tree()部分是不正確的,我更關心如何讓我的數據進入我的視圖(在這一點上)。我只是想包括我所有的代碼...

+2

你告訴什麼一個大致的瞭解該視圖接受類型爲'IQueryable '的模型,但是您沒有將該類型傳遞給視圖。而是傳遞數據庫查詢的結果。您需要'返回查看(* modelClass *)' – CSharper 2014-09-18 18:25:04

回答

2

您將錯誤的類型傳遞給您的視圖。查看視圖預期的模型類型:

@model IQueryable<DataViewer.Models.Viewer> 

Viewer對象的可查詢集合。不過看你給它:

db.Items.Select(i => i.GeoName).Distinct().OrderBy(n => n); 

GeoName屬性的集合。是GeoName有沒有機會string? (錯誤意味着它是。)

如果您的模型期望收集的對象,您需要給它一個這樣的集合。你不能只給它一些字符串,並期望它將這些字符串轉換爲對象。

+0

感謝您的及時回覆(並希望耐心)......是的,GeoName是一個字符串。它是db表上的一個列...那麼,我會在模型的開始處放置什麼@declaration?我正在發送GeoNames集合,那麼我會將模型IQueryable 更改爲模型IQueryable ? – mrwienerdog 2014-09-18 18:29:35

+1

@mrwienerdog:您可以將其更改爲正在發送的類型,根據錯誤消息是'IQueryable '。 – David 2014-09-18 18:32:28

+0

@mrwienerdog:請注意,這意味着您的所有模型將會有一個字符串集合。因此,如果模型上的任何內容都需要該對象的其他屬性,那麼它將無法從字符串中獲取該屬性。 – David 2014-09-18 18:33:55

2

問題是視圖期望不同的數據比你提供給你的控制器。

內,您的看法:

@model IQueryable<DataViewer.Models.Viewer> 

意味着視圖期待瀏覽器的的一個IQueryable <>集合,而是你的控制器內:

// GET: /Viewer/ 
public ActionResult Index() 
{ 
    var result = db.Items.Select(i => i.GeoName).Distinct().OrderBy(n => n); 

    return View(result); 
} 

你傳入字符串的集合。

您需要返回查看器或更改視圖的模型。

1

你的行動而改變這個...

public ActionResult Index() 
    { 
        // var result = db.Items.Select(i => i.GeoName).Distinct().OrderBy(n => n); 
     Viewer model = new Viewer(); 
     model = (from x in db.Items 
       select new Viewer 
       { 
        GeoPSRType = x.FieldName 
        }).Distinct().FirstOrDefault().OrderBy(x => x.SomeField); 


     return View(model); 
    } 

有可能在查詢的一些語法錯誤,但是這給你的,你需要傳遞到視圖