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

标签 c# asp.net-mvc reactjs

我的目标是拥有一个 InputMVC 项目,多个其他 MVC 项目可以使用它来防止代码重复,这样如果我更新 InputMVC 项目中的表单,其他项目也会更新,因为它们将引用相同的 InputMVC 页面。 我画了一张速写图来帮助表达我的需求。

enter image description here

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

实现此目标的最佳途径是什么?可以使用 Reactjs 吗?是否也可以重用我的 Controller ?

编辑 我应该事先澄清这一点。输入项目可以是任何它需要的。它不一定是 MVC 项目。这是我完成这个项目的必备条件,也许这会激发出最佳路径的想法。

要求

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

谢谢!

最佳答案

MVC 由“约定优于配置”驱动。换句话说,它希望 Controller 位于名为 Controllers 的文件夹中,它希望 View 位于 Views/ControllerName 或 Views/Shared 等目录中,因此说起来容易做起来难。

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

我相信您的父项目仍将需要 Controller Action 来反射(reflect)子 Controller 中的 Action ,但这些可以是仅返回子 Controller 的 IActionResult 的简单代理。例如:

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

    return childController.ChildAction();
}

这消除了重写 Controller 的大部分麻烦,并允许自动反射(reflect)子项目中的更改。现在,如果您转到 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

这是因为您的 View 位于子项目中,而不是父项目中,因此不会被父 Controller 找到。 This article and the referenced link应该让您了解如何配置父项目以引用子项目目录中的 View 以消除该错误。接下来,我怀疑您会发现所有与根相关的链接(例如 ~/js/myscript.js)都不起作用,因为它们位于子项目的 wwwroot 中,而不是父项目。也许您可以在文件结构中设置符号链接(symbolic link)或其他内容以从父项目引用子项目,但我还没有测试过。

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

关于c# - 如何使用要在多个其他 MVC 项目中使用的表单构建项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52742864/

相关文章:

javascript - 如何使用map函数在第一个react组件中添加图像并忽略其余组件

c# - HTMLBody 拒绝输出我指定的字体大小,总是以不同的大小结束

c# - 使用在 C# 中使用 TripleDES 加密的 Microsoft Crypt API 在 C++ 中解密文件

c# - 下载和缓存离线数据(图像/视频/3d 模型)的代码架构应该是什么?

c# - 是否可以从默认表 AspNetUsers 中删除行?如果是,请解释一下

javascript - 导入默认类不会让我使用它的功能

c# - 使用函数在天蓝色表存储中使用多个查询参数

c# - 如何在 View 中单击按钮时保留文本框的值,asp.net mvc

asp.net-mvc - 使用声明和 AntiforgeryToken 的 MVC 5 OWIN 登录。我是否错过了 ClaimIdentity 提供商?

reactjs - React Router - 路由在 webpack 生产构建中无法刷新