Не следует связывать методы контроллера, как это, не говоря уже о том, что контроллеры не должны напрямую осуществлять доступ к данным.Я бы порекомендовал вам перенести эту функцию в отдельный класс / репозиторий, который может использоваться обоими контроллерами.
Пример:
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);
}