【问题标题】:MVC3 Razor View EngineMVC3 Razor 视图引擎
【发布时间】:2013-02-26 11:11:53
【问题描述】:

我刚开始学习 MVC3。已经在传统的 ASP.NET 中编码有一段时间了,现在想转向 MVC。

一些我不明白的东西(可能只是在传统 ASP.NET 中的使用方式不同)

我正在尝试编写一个简单的新闻模块来显示新闻并允许为它们插入评论。

所以第一步是,我在我的 SQL 服务器上创建了一个表: TblNews TblCategories Tbl评论

在 Models 文件夹中创建 Linq2SQL 数据类并将其命名为 News.dbml 在其中创建了 Controller HomeController.cs 和一个名为 Index() 的方法。 看起来像这样:

public ActionResult Index()
        {
            Models.NewsDataContext db = new Models.NewsDataContext();
            var Model = (from n in db.TblNews
                         select new
                         {
                             ID = n.ID,
                             Title = n.Title,
                             Description = n.Description,
                             Category = n.TblCategory.CategoryName
                         });

            return View(Model);
        }

如您所见,我正在尝试选择所有新闻及其类别名称(TblNews 和 TblCategories 之间确实有关系)

之后,我将返回从查询中获得的数据。

在我拥有的视图中:

@{
    ViewBag.Title = "News Index Page";
}

<table>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                ID: @item.ID<br />
                Title: @item.Title<br />
                Description: @item.Description<br />
                Category: @item.Category
            </td>
        </tr>
    }
</table>

应该返回如下内容:

ID: 4
Title: asd
Description: asd
Category: 2

这是我从表格中获取的示例数据。

当我运行页面时,它给了我错误消息:

'object' does not contain a definition for 'ID'

但是当我将鼠标放在“item”变量上时,它实际上包含:

{ ID = 4, Title = asd, Description = asd, Category = Test2 }

我还尝试通过在末尾添加 .ToList() 将 Linq Query 作为列表返回。

任何人都可以给我任何提示并让我进入正确的方向吗?

对不起,如果我解释有误。英语不是我的主要语言。 请询问您是否需要更多信息。

非常感谢。

附:我正在使用 Visual Studio 2012

【问题讨论】:

    标签: c# asp.net-mvc-3 linq linq-to-sql razor


    【解决方案1】:

    您的视图顶部缺少模型声明,因此将默认键入object。当您执行item.ID 时,您正在执行object.ID,这就是为什么它抱怨object 不包含ID 的定义

    添加以下内容:

    @model List<Models.NewsDataContext>
    

    此外,请确保在返回模型之前通过调用 .ToList()评估 LINQ 查询,这样查询在到达视图之前就已经针对数据库执行了:

    return View(Model.ToList());
    

    编辑:实际上,在您的 LINQ 查询中,您选择匿名类型,您必须使用具体类才能在您的视图中使用它。下面假设您的TblNews 对应于一个名为News 的类:

    var Model = (from n in db.TblNews
                         select new News //class name here
                         {
                             ID = n.ID,
                             Title = n.Title,
                             Description = n.Description,
                             Category = n.TblCategory.CategoryName
                         });
    
            return View(Model.ToList());
    

    然后将您的模型更改为:

    @model List<News>
    

    【讨论】:

    • @user2110925 啊,您需要在 linq 语句中的 TblNews 类中选择进入,将其更改为 select new TblNews(或任何该类的名称),然后将您的模型更改为 @987654335 @(或任何该类的名称)
    • 我不太了解我应该对应的类的这一部分。 o_O 我怎样才能找到这个?我的表名是 TblNews,但我不太了解那个类的东西。在传统的 ASP.NET 中,我从来不必为表使用类型,只有在填充下拉列表或类似的东西时才必须使用它们。现在我真的很困惑...... :(
    • @user2110925 我认为你的班级是TblNews。基本上,在您的NewsDataContext 中,您将有一个DbSet&lt;TblNews&gt; 是吗?这意味着您应该使用TblNews 类。这不是特定于 MVC,而是特定于使用 ORM,例如实体框架、linq to sql、nhibernate 等。
    • 如果我使用 Linq to SQL 数据类模块,为什么我的 NewsDataContext 中会有 DbSet?这是我不明白的事情......
    • @user2110925 抱歉,您肯定会有一个与表格相对应的类。这是TblNews 类。使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多