Asp.net mvc 4 从MVC4中的视图调用另一个项目的控制器

Asp.net mvc 4 从MVC4中的视图调用另一个项目的控制器,asp.net-mvc-4,razor-2,Asp.net Mvc 4,Razor 2,我有两个项目,d2admin和PartyWeb d2admin是实际的UI,它将具有所有必要的css、js和视图等,如果需要,还将具有控制器 PartyWeb中的每个表都有控制器 假设我有一张名为-Organization的表。此表的控制器将位于PartyWe/Controllers文件夹中 我会在d2admin的意见 现在我的问题是如何从视图Organization.cshtml exists in d2admin调用PartyWeb中的OrganizationController exist

我有两个项目,d2admin和PartyWeb

d2admin是实际的UI,它将具有所有必要的css、js和视图等,如果需要,还将具有控制器

PartyWeb中的每个表都有控制器

假设我有一张名为-Organization的表。此表的控制器将位于PartyWe/Controllers文件夹中

我会在d2admin的意见

现在我的问题是如何从视图Organization.cshtml exists in d2admin调用PartyWeb中的OrganizationController exists


我尝试了Html.RenderAction,这适用于同样存在的控制器,当我调用diff项目的控制器时,我得到了-缺少方法异常。

我发现您的问题很有趣,决定亲自测试。我创建了两个MVC项目(但其中一个也可以是类库,不过我很懒)。第一个MVC项目成为具有路线和视图的主要项目,第二个项目获得了模型和控制器。它从一开始就很有魅力,我就是这样做的

我在第二个项目中创建了这个模型,在我的示例中名为Car(UsersContext这个名称是从默认文件中保留的,因为我希望尽可能少地更改)

我通过拖放将在第二个项目(PartyBiz)中创建的视图复制到第一个项目(d2admin)。然后我删除了第二个项目中的视图,以确保它们没有在那里使用

我还必须将第一个项目(带有视图)的引用添加到第二个项目(模型和控制器)。在那之后,运行第一个项目就可以了

@Html.ActionLink("Go to the cars", "Index", "Car")
我继续在model controller项目中启用迁移,并获得了一个没有任何问题的数据库连接。我可以看到,控制器成功地保存了数据,即使它位于不同的项目中

@Html.ActionLink("Go to the cars", "Index", "Car")
我希望这能在路上帮助你

编辑: 在第一个项目(d2admin)的视图中使用以下代码可以很好地工作,即使第二个项目中存在引用的汽车控制器。此链接用于第一个项目的主(控制器)/索引(视图)

@Html.ActionLink("Go to the cars", "Index", "Car")
编辑2: 这是汽车控制器的索引视图。该视图位于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>
@model IEnumerable
@{
ViewBag.Title=“Index”;
}
指数

@ActionLink(“新建”、“创建”)

@DisplayNameFor(model=>model.CarName) @foreach(模型中的var项目){ @DisplayFor(modelItem=>item.CarName) @ActionLink(“编辑”,“编辑”,新的{id=item.CarId})| @ActionLink(“详细信息”,“详细信息”,新的{id=item.CarId})| @ActionLink(“删除”,“删除”,新的{id=item.CarId}) }
我承认这是一个老生常谈的问题,已经有了公认的答案;然而,我遇到了同样的问题,并能够解决它,我想分享我的经验

据我所知,以下情况是正确的:

  • d2admin是处理网站前端的代码,控制器用于驱动视图和/或视图模型
  • PartyWeb用作域级别的API,用于与某些数据源交互
  • OrganizationController是用于从数据源向d2admin项目获取数据的控制器(反之亦然)
考虑到所有这些,产生部分观点的力量

让我们使用位于d2admin/Views/SomeController.cshtml中的非常简单的视图,其中SomeController是反映与这些视图关联的控制器的文件夹

<h3>A Very Basic View</h3>

@Html.Partial("_SomePartialView", OrganizationController.GetOrganizations())
最后一点魔法… 在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.
    }
}
公共类组织控制器:ApiController
{
//其他一些行动
[HttpGet]
公共静态列表GetOrganizations()
{
var dataSource=GetDataSource();//公开数据源的某个方法
return ReadAllOrganizations(dataSource);//允许我们从数据源读取所有组织的一些方法,即针对数据库执行的一些sql。
}
}

要在另一个项目中使用一个项目的代码,请查看可能的dublicate。您能在这里分享您的观点吗?我的模型在我的PartyBiz项目中,我们使用存储库来获取模型,但这不是问题。我想知道我们是如何调用第二个项目中存在的控制器的。非常感谢您的尝试。名称空间怎么样?您是否能够在PartyBiz项目中更改模型和控制器的名称空间,使其与d2admin项目相同?我现在已经验证了第二个项目(PartyBiz)不需要与第一个项目(d2admin)相同的名称空间。所以你可以忘记我谈论的名称空间。因此,模型和控制器(在第二个项目中)我给出了名称空间PartyBiz和视图(在第一个项目中),我更新了它们,以便它们引用新的PartyBiz名称空间…我将在几秒钟内更新上面的示例代码…好的,现在更新上面的示例代码以使用PartyBiz名称空间。请注意,d2admin中没有任何内容使用PartyBiz命名空间,它仅引用该命名空间,因为PartyBiz命名空间正在PartyBiz项目中使用。非常感谢您尝试此功能,我仍在尝试此功能,我的模型位于PartyBiz.models.Objects命名空间中,我的控制器位于PartyWeb.controllers命名空间中,我的视图在d2admin项目中。是否需要在视图中导入控制器命名空间?
public class Organization
{
    public int Id {get; set;}
    public string Name {get; set;}
    // some additional properties
}
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.
    }
}