1

我有一个名为 PageModels 的模型

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 的控制器。这里我有一个方法:

    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 中给出的标题的页面的内容属性。我一直找不到这样做的好方法。

//编辑

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

4

3 回答 3

2

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

您需要从query具有过滤器结果的变量中获取项目。

public ActionResult showPage(string myTitle)
{
    var query = from a in db.Pages
                where a.title.Contains(myTitle)
                select a;

    return View(query.FirstOrDefault());
}

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

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
}
于 2013-05-02T13:38:29.887 回答
0

您返回的不是查询中的选择,而是 db.pages 中的第一条记录。公共 ActionResult showPage(string myTitle)

 {
        var query = from a in db.Pages
                    where a.title.Contains(myTitle)
                    select a;

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

相反,您应该这样做:

public ActionResult showPage(string myTitle)
    {
        var query = (from a in db.Pages
                    where a.title.Contains(myTitle)
                    select a).FirstOrDefault<PageModels>();

        return View(query);
    }

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

<h1>@Html.Display(@Model.title)</h1>

请注意,我已将结果显式键入为 PageModel,并将选择部分括在括号中。这很重要——如果你不告诉 Linq 使用什么类型,它会给你一个通用的结果,它不是你的数据所代表的对象的实际实例。如果您想要一个尚未定义的类型,您可以使用

var query=(from a in db.Pages where a.title.Contains(myTitle)
                    select new {a.Title, a.Author});

这将为您提供一个“动态”对象,其中包含基于数据中的标题和作者列的 Title 和 Author 属性。

希望这会有所帮助——我们都做到了。

乔伊

于 2013-05-02T13:40:43.677 回答
0

将查询传递给视图

var query = from a in db.Pages
                where a.title.Contains(myTitle)
                select a;
var result = query.FirstOrDefault();
return View (result);

在查看使用

@HTML.Displyfor(Model.content)
于 2013-05-02T13:42:48.930 回答