Entity framework 如何从另一个控制器引用控制器功能

Entity framework 如何从另一个控制器引用控制器功能,entity-framework,asp.net-mvc-3,code-first,Entity Framework,Asp.net Mvc 3,Code First,尝试学习来自Linux/LAMP背景的ASP MVC(换句话说,我是个新手) 出于某种原因,我似乎无法在另一个控制器中使用控制器中定义的函数 以下是我的MessagesController.cs文件中的函数: public List<Message> GetMessagesById(string username) { return db.Messages.Where(p => p.user == username).ToList();

尝试学习来自Linux/LAMP背景的ASP MVC(换句话说,我是个新手)

出于某种原因,我似乎无法在另一个控制器中使用控制器中定义的函数

以下是我的MessagesController.cs文件中的函数:

    public List<Message> GetMessagesById(string username)
    {
        return db.Messages.Where(p => p.user == username).ToList();
    }
消息不包含名为getMessagesById的方法


如何引用它?

您不应该像这样链接控制器方法,更不用说控制器不应该直接执行数据访问。我建议您将此函数外部化到一个单独的类/存储库中,这两个控制器都可以使用

例如:

public class MessagesRepository
{
    public List<Message> GetMessagesById(string username)
    {
        return db.Messages.Where(p => p.user == username).ToList();
    }
}
好的,这是第一步。通过引入此存储库的抽象,将控制器与存储库分离,可以改进此代码:

public interface IMessagesRepository
{
    List<Message> GetMessagesById(string username);
}

public class MessagesRepository: IMessagesRepository
{
    public List<Message> GetMessagesById(string username)
    {
        return db.Messages.Where(p => p.user == username).ToList();
    }
}
最后,您将配置DI框架,以将相应的实现传递到这些控制器中

我还建议您使用强类型视图模型替换此
ViewBag

public class MyViewModel
{
    public List<Message> Messages { get; set; }
}

您不应该像这样链接控制器方法,更不用说控制器不应该直接执行数据访问。我建议您将此函数外部化到一个单独的类/存储库中,这两个控制器都可以使用

例如:

public class MessagesRepository
{
    public List<Message> GetMessagesById(string username)
    {
        return db.Messages.Where(p => p.user == username).ToList();
    }
}
好的,这是第一步。通过引入此存储库的抽象,将控制器与存储库分离,可以改进此代码:

public interface IMessagesRepository
{
    List<Message> GetMessagesById(string username);
}

public class MessagesRepository: IMessagesRepository
{
    public List<Message> GetMessagesById(string username)
    {
        return db.Messages.Where(p => p.user == username).ToList();
    }
}
最后,您将配置DI框架,以将相应的实现传递到这些控制器中

我还建议您使用强类型视图模型替换此
ViewBag

public class MyViewModel
{
    public List<Message> Messages { get; set; }
}

GetMessageById
(以及访问消息所需的所有其他方法)放置到单独的类中,并在需要获取
Message
数据的任何地方使用该类

MessageService service = new MessageService();
ViewBag.messages = service.GetMessagesById(...);

GetMessageById
(以及访问消息所需的所有其他方法)放置到单独的类中,并在需要获取
Message
数据的任何地方使用该类

MessageService service = new MessageService();
ViewBag.messages = service.GetMessagesById(...);

谢谢你的帮助。您建议的MessageService类是模型类还是控制器类。还是有关系?这是模型类/业务逻辑。谢谢您的帮助。您建议的MessageService类是模型类还是控制器类。还是重要?这是模型类/业务逻辑。谢谢。您的抽象消息Repository与仅将此方法移动到模型类不同吗?您遇到了我提出的另一个问题(但没有提出),关于传递模型还是使用viewbag更好。@Michahoover,视图模型是一个包含视图所需信息的类。它通常表示一个包含要在视图中显示的属性的POCO类。因此,通常的工作流如下:控制器操作使用存储库获取某个模型,它根据存储库返回的信息填充视图模型,并将视图模型传递给视图。就
ViewBag
而言,我个人一直建议不要使用它。强类型视图和视图模型是构建ASP.NET MVC应用程序的正确方法。感谢您的支持,Darin。虽然我是新手,但我还是很感激你的建议。为什么拥有一个模型、一个视图和一个单独的模型视图会更好?随着我获得更多的经验,我会权衡你关于类型安全性的说法,但现在,我只是想让某些东西起作用。@micahhoover,通常MVC中的m代表视图模型。这是一个传递给视图的类。此类是专门为给定视图设计的。数据访问层与web应用程序完全分离。它可以在其他应用程序中重用。它适用于模型。这些模型是反映业务需求的类。视图模型只是特定ASP.NET MVC应用程序中特定屏幕的业务模型的特定表示。谢谢。您的抽象消息Repository与仅将此方法移动到模型类不同吗?您遇到了我提出的另一个问题(但没有提出),关于传递模型还是使用viewbag更好。@Michahoover,视图模型是一个包含视图所需信息的类。它通常表示一个包含要在视图中显示的属性的POCO类。因此,通常的工作流如下:控制器操作使用存储库获取某个模型,它根据存储库返回的信息填充视图模型,并将视图模型传递给视图。就
ViewBag
而言,我个人一直建议不要使用它。强类型视图和视图模型是构建ASP.NET MVC应用程序的正确方法。感谢您的支持,Darin。虽然我是新手,但我还是很感激你的建议。为什么拥有一个模型、一个视图和一个单独的模型视图会更好?随着我获得更多的经验,我会权衡你关于类型安全性的说法,但现在,我只是想让某些东西起作用。@micahhoover,通常MVC中的m代表视图模型。这是一个传递给视图的类。此类是专门为给定视图设计的。数据访问层与web应用程序完全分离。它可以在其他应用程序中重用。它适用于模型。这些模型是反映业务需求的类。视图模型只是特定ASP.NET MVC应用程序中特定屏幕的业务模型的特定表示。