我有两个项目,d2admin和PartyWeb。
d2admin是实际的用户界面,它将包含所有必需的css,js和视图eftc。以及控制器(如果需要)。
PartyWeb正在为Party中的每个表提供控制器。
说我有一张名为 - 组织的表。 该表的控制器将位于PartyWe / Controllers文件夹中。
我将在d2admin中获得意见。
现在我的问题是如何从d2admin中存在的Organization.cshtml视图中调用PartyWeb中存在的OrganizationController?
我尝试使用Html.RenderAction,这对于控制器存在同样的工作,当我调用diff项目的控制器时我得到了 - 缺少方法异常。
有人可以帮忙吗?
答案 0 :(得分: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连接到Car的控制器(通过右键单击Controller文件夹并选择 MVC控制器,带有读/写操作和视图,使用Entity Framework )
完成后控制器看起来像这样(为了保持示例简短,已删除了许多行)
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)的视图中使用以下代码工作正常,即使第二个项目中存在Car控制器引用。此链接用于第一个项目中的主页(控制器)/索引(视图)。
@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>
答案 1 :(得分:0)
我承认这是一个已经被接受的答案的老问题;然而,我遇到了同样的问题,并且能够解决它,并希望分享我的经验。
根据我的理解,以下事情都是真的:
考虑到所有这些,产生了部分观点的力量!
让我们使用位于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 / Models / 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.
}
}