首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MVC4中如何从数据库中获取特定行

在MVC4中如何从数据库中获取特定行
EN

Stack Overflow用户
提问于 2013-05-02 21:31:24
回答 3查看 12.7K关注 0票数 1

我有一个叫PageModels的模型

代码语言:javascript
运行
复制
public class PageModels
{
    public int id { get; set; }

    public string title { get; set; }

    [DataType(DataType.MultilineText)]
    [AllowHtml]
    public string content { get; set; }

    public int parent { get; set; }

    [DataType(DataType.Date)]
    public DateTime created_at { get; set; }

    [DataType(DataType.Date)]
    public DateTime updated_at { get; set; }

    [DataType(DataType.Date)]
    public DateTime published_at { get; set; }
}

基于这个模型,我有一个叫做PagesController的控制器。这里我有一个方法:

代码语言:javascript
运行
复制
    public ActionResult showPage(string myTitle)
    {
        var query = from a in db.Pages
                    where a.title.Contains(myTitle)
                    select a;

        return View(db.Pages.FirstOrDefault());
    }

我希望能够在返回值中获得具有myTitle中给定标题的页面的content属性。我还没能找到一个好的方法来做到这一点。

//编辑

我一直犯的那个错误都是我的错。在尝试修复我的问题和实现您的解决方案之间,我将方法返回类型更改为PageModels,这就是它不断抛出该错误的原因。现在它可以工作了,但是视图没有显示任何内容。我会试着自己解决这个问题的,谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-02 21:38:30

您将获得对第一行中的变量query进行过滤的结果,但是您将向视图返回其他内容(从DB读取所有页面并从集合中获取第一项)。

您需要从变量query中获取项目,该变量包含过滤器的结果。

代码语言:javascript
运行
复制
public ActionResult showPage(string myTitle)
{
    var query = from a in db.Pages
                where a.title.Contains(myTitle)
                select a;

    return View(query.FirstOrDefault());
}

确保在FirstOrDefault之后检查null,否则在集合中没有记录时会遇到异常。

代码语言:javascript
运行
复制
public ActionResult showPage(string myTitle)
{
    var query = from a in db.Pages
                where a.title.Contains(myTitle)
                select a;
    var item=query.FirstOrDefault();
    if(item!=null)
       return View(item);
    else
       return View("NotFound");  //Let's show a view about item not found
}
票数 2
EN

Stack Overflow用户

发布于 2013-05-02 21:40:44

您返回的不是查询中的选定内容,而是db.pages中的第一条记录。公共字符串showPage(string myTitle)

代码语言:javascript
运行
复制
 {
        var query = from a in db.Pages
                    where a.title.Contains(myTitle)
                    select a;

        return View(db.Pages.FirstOrDefault());
    }

相反,您应该这样做:

代码语言:javascript
运行
复制
public ActionResult showPage(string myTitle)
    {
        var query = (from a in db.Pages
                    where a.title.Contains(myTitle)
                    select a).FirstOrDefault<PageModels>();

        return View(query);
    }

这将发送只包含第一个页面的模型,该页面的标题包含您的title参数,您可以根据需要在标记中使用该参数:

代码语言:javascript
运行
复制
<h1>@Html.Display(@Model.title)</h1>

请注意,我已经显式地将结果键入为PageModel,并将select部分括在括号中。这很重要--如果不告诉Linq使用哪种类型,它会给出一个通用的结果,而不是数据表示的对象的实际实例。如果需要尚未定义的类型,可以使用

代码语言:javascript
运行
复制
var query=(from a in db.Pages where a.title.Contains(myTitle)
                    select new {a.Title, a.Author});

这将为您提供一个"on the fly“对象,该对象具有基于数据中的Title和Author列的title和author属性。

希望这能帮上忙--我们都做过。

乔伊

票数 0
EN

Stack Overflow用户

发布于 2013-05-02 21:42:49

将查询传递给视图

代码语言:javascript
运行
复制
var query = from a in db.Pages
                where a.title.Contains(myTitle)
                select a;
var result = query.FirstOrDefault();
return View (result);

在视图中使用

代码语言:javascript
运行
复制
@HTML.Displyfor(Model.content)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16339357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档