2014-09-18 47 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); 
    } 

有可能在查询的一些语法错误,但是这给你的,你需要传递到视图