Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 基于复杂模块的ASP.NET MVC 2在数据库中创建新记录_Asp.net Mvc_Portable Areas - Fatal编程技术网

Asp.net mvc 基于复杂模块的ASP.NET MVC 2在数据库中创建新记录

Asp.net mvc 基于复杂模块的ASP.NET MVC 2在数据库中创建新记录,asp.net-mvc,portable-areas,Asp.net Mvc,Portable Areas,我有一个非常棘手的问题要解决,我想了很多,搜索了很多,得出了一个结论,我将在下面提到。 问题是我有一个客户想要创建一个基于通用功能的网站,所以我们称之为模块,所以我想使用MVC Contrib便携区,这是插入模块的好主意,但我有一个大问题,假设我创建了一个博客模块,将在他想要的新网站中实现,现在一些用户有独特的需求,比如其中一个用户需要在每篇文章中添加图片库,或者在每篇文章中添加参考列表。 这在正常情况下是很容易的,因为你只有一个站点可以工作,所以你所要做的就是 将带有外键的新库表添加到Blo

我有一个非常棘手的问题要解决,我想了很多,搜索了很多,得出了一个结论,我将在下面提到。 问题是我有一个客户想要创建一个基于通用功能的网站,所以我们称之为模块,所以我想使用MVC Contrib便携区,这是插入模块的好主意,但我有一个大问题,假设我创建了一个博客模块,将在他想要的新网站中实现,现在一些用户有独特的需求,比如其中一个用户需要在每篇文章中添加图片库,或者在每篇文章中添加参考列表。 这在正常情况下是很容易的,因为你只有一个站点可以工作,所以你所要做的就是

  • 将带有外键的新库表添加到Blog表
  • 重新生成Linq2SQl代码并更新模型
  • 将新表单元素添加到创建、编辑和删除视图中
  • 在控制器中添加逻辑
但在我的情况下,由于两个原因,它是复杂和时间繁琐的

  • 如果新功能很酷 客户决定在 所有站点,然后我必须重复 为每个站点工作
  • 如果功能是唯一的,它将在将来为我创建不一致性
这就是为什么作为解决问题的第一步,我使用可移植区域为每个模块创建插件,现在,通过为每个新模块或插件拖动1个DLL,这肯定会减轻我的工作,但我这里有一个小问题,这

  • 因为新模块或加载项是 Dll,我怎样才能创建这样一个 “我的管理”面板中的功能 安装新的加载项或查找任何新的 添加模块/加载项拖动新DLL 到主应用程序
  • 什么是最好的 练习创建安装 便携式区域内的程序, 如更新数据库、新路由等
现在来看模块插件特有的最大问题:) 让我们收回Article Gallery插件,如果我遵循上面提到的逻辑,将其创建为一个可移植区域,那么在模块代码中创建一个功能来循环所有已安装的插件并在CRUD视图中列出它们会更容易,但是,由于我隔离了加载项,并且由于上述原因不想手动更新主模块代码,因此无法对新加载项执行CRUD操作以与主模块同步,因为没有外键关系,同样是因为正如我上面所说的,它可能是可选的,所以我想到了下面的解决方案,我希望会有一个更好的解决方案

首先在安装过程中,我将为Gallery插件创建一个表,但不是创建外键关系,而是创建一个手动外键,当我使用以下代码创建记录时,通过在主模块控制器中生成一个唯一ID来填充该外键,然后将其存储在ViewData中,并在创建新记录时将其传递给加载项控制器

private  string GenerateId()
 {
  long i = 1;
  foreach (byte b in Guid.NewGuid().ToByteArray())
  {
   i *= ((int)b + 1);
  }
  return string.Format("{0:x}", i - DateTime.Now.Ticks);
 }
ViewData["FK"] = GenerateId();
但这是我的担忧

  • 这条路可行还是简单明了 愚蠢的
  • 这是一种技术吗 生成一个真正唯一的密钥

如果我的问题是蹩脚的,我非常抱歉,但这是最好的提问地点,我想很多人都希望有这样的功能,希望有人能回答我

我认为这是一个很棒的问题。不久前,我开始使用MVC1开发一个CMS项目,我想在这里支持插件。我让它工作,以便管理员可以把一个新的插件程序集放到bin文件夹中,下一个应用程序启动时,它将扫描所有程序集的IPlugin(或其他)并加载它们。我将部分视图嵌入插件程序集,使其完全独立。每个插件放在页面上时都有一个唯一的标识符,插件的控制器知道如何使用该ID查询自己的表(存储库)中的数据。主应用程序对插件的模式一无所知

这里唯一的区别是,听起来你会在同一个数据库上运行多个网站,你需要区分每个网站需要哪个插件实例。我假设你在某个地方有一个键,指示它是哪个网站,可以通过外键为用户所在的页面只选择该网站的插件

我不确定这是否是一个答案,我只是想大声说出来。希望这能对讨论有所帮助

编辑:为了自动加载插件,我使用NInject的能力扫描程序集以查找iModule。我的IPlugin继承自
Ninject.Modules.injectModule
,所有插件都实现了IPlugin接口。然后在应用程序启动时,我有以下几行:

kernel.Load( "*.Plugin.dll" );

其中kernel是Ninject.IKernel,该行将扫描与该文件模式匹配的任何程序集,因此我可以插入Weather.Plugin.dll之类的程序集。

这根本不是一个蹩脚的问题,但它是一个设计问题,需要一些思考。不过,我认为您的数据库设计不应该要求您创建自己的ID。我的直觉是,您需要一个包含所有插件信息的表(如果您正在这样做的话),并需要一个额外的列来区分插件。这将允许您对所有插件使用相同的Linq到SQL模式。如果某个插件有唯一的信息,您可以为该插件的唯一信息创建一个单独的Linq到SQL模式。单独的Linq到SQL模式可以与该插件一起使用,因此您无需在每次添加具有唯一信息的插件时更新主Linq到SQL模式。这只是解决这个问题的众多方法之一。谢谢大家,但是,你能告诉我插件模式中应该包括什么吗,只有插件表?另一个仍然存在的问题是如何将新插入的记录与