2011-05-21 107 views
0

努力學習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

廣場GetMessageById(並在需要訪問消息的所有其他方法)來分離並在任何需要獲取Message數據的地方使用該類。

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

感謝您的幫助。您提出的MessageService類是模型還是控制器類?或者它有什麼關係? – micahhoover 2011-05-21 16:12:37

+0

它是模型類/業務邏輯。 – 2011-05-21 17:22:14

3

你不應該像這樣連接控制器方法,更不用說控制器不應該直接執行數據訪問。我建議你將這個函數外化爲一個單獨的類/存儲庫,這可以被兩個控制器使用。

實施例:

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); 
} 
+0

謝謝。你的抽象MessagesRepository與將此方法移動到模型類有所不同嗎?你有另外一個問題(但沒有問)是關於傳遞模型還是使用viewbag更好。 – micahhoover 2011-05-21 16:15:26

+0

@micahhoover,視圖模型是一個包含視圖需要的信息的類。通常它代表一個POCO類,其中包含要在視圖中顯示的屬性。因此,通常的工作流程如下所示:控制器操作使用存儲庫來獲取某個模型,它會根據存儲庫返回的信息填充視圖模型,並將視圖模型傳遞給視圖。就「ViewBag」而言,我個人總是建議不要使用它。強類型視圖和視圖模型是構建ASP.NET MVC應用程序的正確方法。 – 2011-05-21 19:17:30

+0

感謝elarin,Darin。即使我是新手,我也很想欣賞你的建議。爲什麼最好有一個模型,一個視圖和一個單獨的模型視圖?隨着我獲得更多的經驗,我會在類型安全方面權衡你的話,但現在,我只是想找點工作。 – micahhoover 2011-05-26 07:20:30

相關問題