如何使用要在其他多个MVC项目中使用的表单来构建项目

时间:2018-10-10 14:43:56

标签: c# asp.net-mvc reactjs

我的目标是拥有一个InputMVC项目,其他多个MVC项目可以使用该项目来防止代码重复,因此,如果我在InputMVC项目中更新表单,其他项目也会被更新,因为它们将引用同一InputMVC页面。 我制作了一张快速图纸来帮助传达我的需求。

enter image description here

我的理解是cshtml文件未编译,因此无法在其他MVC项目中引用它们。我还想尽可能使用ReactJS创建表单。另外一个目标是重用我的控制器,因为这些形式将更新数据库,并且我不想重复代码,并且每次需要更改时都必须更新每个项目。

实现此目标的最佳途径是什么?有可能使用Reactjs吗?是否可以重用我的控制器?

编辑 我之前应该已经澄清了。 Input项目可以是任何需要的项目。它不必是MVC项目。这是我为该项目准备的必备条件,也许这将激发出一条最佳途径的想法。

要求 1)表单必须使用ReactJS 2)表单必须是单独的实体,以防止重复代码 3)表单将在另一个MVC项目中用作“部分” 4)表单将以某种方式与数据库通信,但我并不担心这部分

谢谢!

1 个答案:

答案 0 :(得分:1)

MVC由“约定之上的配置”驱动。换句话说,它希望控制器位于名为Controllers的文件夹中,并且希望视图位于Views / ControllerName或Views / Shared等目录中,因此说起来容易做起来难。

如果您对此很感兴趣,我将创建第二个MVC项目,并在父项目中,添加对新创建的子项目的引用。

我相信您的父项目仍然需要与子控制器中的动作相似的控制器动作,但是这些可以是简单的代理,它们仅返回子动作的IActionResult。例如:

public IActionResult ParentAction()
{
    var childController = new ChildApp.Controllers.ChildController(); // You may need to pass in any dependencies yourself

    return childController.ChildAction();
}

这消除了重写控制器的大部分麻烦,并允许子项目中的更改自动反映出来。现在,如果您转到localhost:1234 / Parent / ParentAction,将看到以下错误:

InvalidOperationException: The view 'ParentAction' was not found. The following locations were searched:
/Views/Parent/ParentAction.cshtml
/Views/Shared/ParentAction.cshtml
/Pages/Shared/ParentAction.cshtml

这是因为您的视图在子项目中,而不在父项目中,因此父控制器找不到该视图。 This article and the referenced link应该使您了解如何配置父项目以引用子项目目录中的视图,以消除该错误。接下来,我怀疑您会发现所有与根相关的链接(例如~/js/myscript.js)均不起作用,因为这些链接位于子项目而不是父项目的wwwroot中。也许您可以在文件结构中设置符号链接,或通过某种方式引用父项目中的子项目,但我尚未对此进行测试。

我认为更好的解决方案是分别发布两个项目,并根据需要让父项目从子项目中加载内容。您可以研究反​​向代理,以查看如何工作的示例。您可以使用完整的URL根据需要引用脚本和图像。只要设置了正确的请求标头,就可以根据需要构建内容(请参阅X-Frame-Options)。子控制器也可以作为API向父级提供数据。