как ссылаться на функцию контроллера из другого контроллера - PullRequest
0 голосов
/ 21 мая 2011

Попытка изучить ASP MVC из Linux / LAMP (другими словами, я новичок) ...

По какой-то причине я не могу использовать функцию, определенную в контроллере вдругой контроллер.

Вот функция в моем файле MessagesController.cs:

    public List<Message> GetMessagesById(string username)
    {
        return db.Messages.Where(p => p.user == username).ToList();
    }

Когда я пытаюсь сослаться на него:

    using LemonadeTrader.Models;
    using LemonadeTrader.Controllers;     // added this to pull the Messages::getMesssagesById
    ...

    ViewBag.messages = lemondb.Messages.GetMessagesById(Membership.GetUser().ProviderUserKey.ToString());

Я получаю что-то вродеlemondb.Messages не содержит метод с именем GetMesssagesById.

Как я могу ссылаться на него?

Ответы [ 2 ]

3 голосов
/ 21 мая 2011

Не следует связывать методы контроллера, как это, не говоря уже о том, что контроллеры не должны напрямую осуществлять доступ к данным.Я бы порекомендовал вам перенести эту функцию в отдельный класс / репозиторий, который может использоваться обоими контроллерами.

Пример:

public class MessagesRepository
{
    public List<Message> GetMessagesById(string username)
    {
        return db.Messages.Where(p => p.user == username).ToList();
    }
}

, а затем:

public class FooController: Controller
{
    public ActionResult Index()
    {
        var db = new MessagesRepository()
        ViewBag.messages = db.GetMessagesById(Membership.GetUser().ProviderUserKey.ToString());
        return View();
    }
}

public class BarController: Controller
{
    public ActionResult Index()
    {
        var db = new MessagesRepository()
        ViewBag.messages = db.GetMessagesById(Membership.GetUser().ProviderUserKey.ToString());
        return View();
    }
}

ОК, это первый шаг.Этот код можно улучшить, отсоединив контроллеры от репозитория, введя абстракцию для этого репозитория:

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();
    }
}

, тогда вы можете использовать конструктор для этих контроллеров:

public class FooController: Controller
{
    private readonly IMessagesRepository _repository;
    public class FooController(IMessagesRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        ViewBag.messages = _repository.GetMessagesById(Membership.GetUser().ProviderUserKey.ToString());
        return View();
    }
}

public class BarController: Controller
{
    private readonly IMessagesRepository _repository;
    public class BarController(IMessagesRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        ViewBag.messages = _repository.GetMessagesById(Membership.GetUser().ProviderUserKey.ToString());
        return View();
    }
}

наконец вынастроил бы вашу структуру DI для передачи соответствующей реализации в эти контроллеры.

Я бы также порекомендовал вам заменить ViewBag на строго типизированную модель представления:

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

, а затем:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        Messages = _repository.GetMessagesById(Membership.GetUser().ProviderUserKey.ToString())
    };
    return View(model);
}
2 голосов
/ 21 мая 2011

Поместите GetMessageById (и все другие методы, необходимые для доступа к сообщениям), чтобы отделить класс и использовать этот класс везде, где вам нужно получить Message данные.

MessageService service = new MessageService();
ViewBag.messages = service.GetMessagesById(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...