2013-06-12 134 views
3

我有兩個項目,d2admin和PartyWeb。從MVC4中查看另一個項目的呼叫控制器

d2admin是實際的用戶界面,它將具有所有必要的css,js和views eftc。以及控制器(如果需要)。

PartyWeb爲派對中的每個表格提供控制器。

假設我有一張名爲 - Organization的表。 此表的控制器將位於PartyWe/Controllers文件夾中。

我會在d2admin中查看。

現在我的問題是如何從視圖Organization.cshtml存在於d2admin中調用PartyWeb中存在的OrganizationController?

我試着用Html.RenderAction,這是工作的控制器存在於相同的,當我調用差異項目的控制器我越來越 - 缺少方法異常。

有人可以幫忙嗎?

+0

要在另一個使用一個項目的代碼,看看[這裏](http://stackoverflow.com/questions/1116465/how-do-you-share- code-between-projects-solutions-in-visual-studio)可能的dublicate。 – Drasive

回答

2

我發現你的問題很有趣,並決定自己測試。我創建了兩個MVC項目(但其中一個也可能是一個類庫,但我很懶)。第一個MVC項目成爲主要的路線和視圖項目,第二個項目獲得了模型和控制器。它從一開始就像一個魅力,這是我如何做到的。

我在第二個項目中創建了模型,在我的示例中名爲Car(,因爲我想盡可能少地更改默認文件中的UsersContext名稱)。

namespace PartyBiz.Models 
{ 
    public class UsersContext : DbContext 
    { 
     public UsersContext() 
      : base("DefaultConnection") 
     { 
     } 

     public DbSet<Car> Cars { get; set; } 
    } 

    [Table("Cars")] 
    public class Car 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int CarId { get; set; } 
     public string CarName { get; set; } 
    } 
} 

我再建項目,並創建了EF連接到車載控制器(控制器上的文件夾,右擊並選擇MVC控制器的讀/使用實體框架寫操作和視圖)

控制器看起來是這樣做的時候(很多行已被刪除,以保持例如短)

namespace PartyBiz.Controllers 
{ 
    public class CarController : Controller 
    { 
     // UsersContext is a left over from the default MVC project 
     private UsersContext db = new UsersContext(); 

     public ActionResult Index() 
     { 
      return View(db.Cars.ToList()); 
     } 

     // Many other actions follows here... 
    } 
} 

在第二個項目(PartyBiz)我複製到創建的意見第一個項目(d2admin)通過拖放。然後,我刪除了第二個項目中的視圖,以確保它們不在那裏使用。

我也不得不從第一個項目(包括視圖)添加到第二個項目(模型和控制器)的引用。之後,它運行得很好,運行第一個項目。

我繼續在模型控制器項目中啓用遷移,並且沒有任何問題地獲得數據庫連接。我可以看到控制器設法保存數據,即使它位於不同的項目中。

我希望這可以幫助你在路上...

編輯: 使用從第一個項目(d2admin)的意見,下面的代碼工作得很好,即使汽車稱爲控制器在第二到存在項目。該鏈接用於第一個項目中的主頁(控制器)/索引(視圖)。

@Html.ActionLink("Go to the cars", "Index", "Car") 

EDIT2: 這是Car控制器的索引視圖。該視圖位於d2admin中,並引用PartyBiz項目中的控制器。

@model IEnumerable<PartyBiz.Models.Car> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.CarName) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.CarName) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.CarId }) | 
      @Html.ActionLink("Details", "Details", new { id=item.CarId }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.CarId }) 
     </td> 
    </tr> 
} 
</table> 
+0

你可以在這裏分享你的觀點嗎?我的模型在我的PartyBiz項目中,我們使用知識庫來獲得那些不是問題的模型。我想知道我們如何調用第二個項目中存在的控制器。感謝很多嘗試.. – mmssaann

+0

它是如何與命名空間?您是否可以在PartyBiz項目中更改模型和控制器的命名空間,使它們與d2admin項目相同? – Ohlin

+0

我已經驗證第二個項目(PartyBiz)不需要與第一個項目(d2admin)相同的名稱空間。所以你可以忘記我關於命名空間的討論。所以模型和控制器(在第二個項目中)我給名稱空間PartyBiz和視圖(在第一個項目中),我更新了它們以便引用新的PartyBiz名稱空間......我將更新上面的示例代碼以及幾秒... – Ohlin

0

我承認這是一個老問題,已經接受了答案;然而,我遇到了同樣的問題,並能夠解決它,並希望分享我的經驗。

從我的理解下面的東西是真實的:

  • d2admin是處理網站的前端代碼和控制器來驅動的意見和/或視圖模型。
  • PartyWeb被用作域級別的API來與某些數據源進行交互。
  • OrganizationController是控制你使用來從數據源到d2admin項目數據(反之亦然)

與所有的考慮到這一點,出現的部分景色的力量!

讓我們使用將位於d2admin/Views/SomeController.cshtml中的非常簡單的View,其中SomeController是反映與這些視圖關聯的控制器的文件夾。

<h3>A Very Basic View</h3> 

@Html.Partial("_SomePartialView", OrganizationController.GetOrganizations()) 

注意,這個觀點有沒有模式,並調用部分,它的模式是填充在那裏......,這就是它!現在我們將如何編寫_SomePartialView.cshtml?

我們將它放在d2admin/Views/Shared文件夾中,因此完整路徑爲:d2admin/Views/Shared/_SomePartialView.cshtml。該文件將看起來像

@model IEnumerable<PartyWeb.Models.Organization> 

<div> 
    @foreach(var o in Model){ 
     @Html.DisplayFor(modelItem => item.Id) 
     @Html.DisplayFor(modelItem => item.Name) 
     <br/> 
    } 
</div> 

我們可以看到這個視圖將顯示一些基本信息假設,以下是我們的模型在PartyWeb /模型發現/ Organization.cs

public class Organization 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    // some additional properties 
} 

,決賽有點神奇...... 在OrganizationController.cs中,我們需要添加靜態動作,使我們能夠將數據綁定到我們的局部視圖模型。因此,我們將增加以下內容:

public class OrganizationController : ApiController 
{ 
    // Some Other Actions 

    [HttpGet] 
    public static List<Organization> GetOrganizations() 
    { 
     var dataSource = GetDataSource(); // Some Method that exposes the datasource 
     return ReadAllOrganizations(dataSource); // Some method that allows us to read all of the organiztions from the dataSource, i.e. some sql that executes against a database. 
    } 
}