1

我正处于开发新模块的早期阶段。

其中大部分是根据模型等进行布局的。还设置了所有迁移,我的数据库现在有我的模块的表。

我在打电话时遇到以下错误ContentManager.New<myPart>,希望得到一些帮助。

错误是这样的:

An unhandled exception has occurred and the request was terminated. Please refresh the page. If the error persists, go back
Specified cast is not valid.
System.InvalidCastException: Specified cast is not valid. 
at Orchard.ContentManagement.ContentCreateExtensions.New[T]
              (IContentManager manager, String contentType) 

触发异常的代码块是这样的:

public static T New<T>(this IContentManager manager, string contentType) where T : class, IContent {
            var contentItem = manager.New(contentType);
            if (contentItem == null)
                return null;

            var part = contentItem.Get<T>();
            if (part == null)
                throw new InvalidCastException();

            return part;
        }

以下是与我正在努力解决的操作相关的模块的各个部分:

内容部分

public class GoogleMapsSettingsPart : ContentPart<GoogleMapsSettingsPartRecord>
{
    public string ApiKey { 
        get { return Record.ApiKey; }
        set { Record.ApiKey = value; }
    }
}

内容部分记录

public class GoogleMapsSettingsPartRecord : ContentPartRecord
{
    public virtual string ApiKey { get; set; }
}

处理程序

public GoogleMapsSettingsPartHandler(IRepository<GoogleMapsSettingsPartRecord> repository)
        {
            Filters.Add(StorageFilter.For(repository));
        }

此表的迁移

// Settings Table
SchemaBuilder.CreateTable("GoogleMapsSettingsPartRecord", table => table
       .ContentPartRecord()
       .Column("ApiKey", DbType.String, c => c.WithLength(60))
);

此模型的控制器中的一些代码等

public AdminController(IContentManager contentManager, IShapeFactory shapeFactory, IServiceLocatorService serviceLocatorService, INotifier notifier)
        {
            _contentManager = contentManager;
            _serviceLocatorService = serviceLocatorService;
            _notifier = notifier;
            Shape = shapeFactory;
            T = NullLocalizer.Instance;
        }


        /// <summary>
        /// Display Settings
        /// </summary>
        /// <returns></returns>
        public ActionResult Settings()
        {
            var settings = _serviceLocatorService.GoogleMapsSettings;
            var editor = CreateSettingsEditor(settings);
            var model = _services.ContentManager.BuildEditor(settings);

            return View((object)model);
        }

最后 - 我的调用引发此异常的服务

private GoogleMapsSettingsPart _settings;
        public GoogleMapsSettingsPart GoogleMapsSettings
        {
            get {
                if (_settings == null)
                {
                    _settings = _contentManager.Query<GoogleMapsSettingsPart, GoogleMapsSettingsPartRecord>().List().FirstOrDefault();

                    if (_settings == null)
                    {
                        _settings = _contentManager.New<GoogleMapsSettingsPart>("GoogleMapsSettings");
                    }
                }
                return _settings;
            }
        }

发生异常的实际行是_settings = _contentManager.New<GoogleMapsSettingsPart>("GoogleMapsSettings");

尽管没有任何效果,但我已经尝试了各种代替“GoogleMapsSettings”的方法。

在这一点上,我很确定这很简单,尽管它避开了我..我对果园的有限了解让我感到难过

任何帮助,将不胜感激 :)

4

3 回答 3

2

抛出异常是因为您的内容类型没有您指定要获取的部分。

 _contentManager.New<GoogleMapsSettingsPart>("GoogleMapsSettings");

此方法调用创建一个新的内容项类型GoogleMapSettings并将内容项作为GoogleMapsSettingsPart. 但是,GoogleMapSettings内容类型似乎没有GoogleMapsSettingsPart. 这就是为什么这里会抛出异常。

var part = contentItem.Get<T>();
if (part == null)
    throw new InvalidCastException();

您必须将部件动态附加到您的内容类型或在迁移中执行(或在管理员中手动执行,但这不是一个好主意)。您的迁移应如下所示。

this.ContentDefinitionManager.AlterTypeDefinition("GoogleMapsSettings",
    alt => alt
        .WithPart("GoogleMapsSettingsPart");
于 2013-10-27T21:58:17.287 回答
0

好的,所以我修复了它...

我对 Orchard 工作原理的理解仍处于学习阶段。

对于这个特定的操作,我不想在管理员中有一个内容类型 - 虽然不知道为什么在添加 ContentType 后它仍然不起作用......

无论如何,将下面的行添加到我的处理程序会处理其余的事情。我相信它实际上是在创建一种临时类型,因此系统中不需要它。

public GoogleMapsSettingsPartHandler(IRepository<GoogleMapsSettingsPartRecord> repository)
        {
            Filters.Add(new ActivatingFilter<GoogleMapsSettingsPart>("GoogleMapsSettings"));
            Filters.Add(StorageFilter.For(repository));

            Filters.Add(new TemplateFilterForRecord<GoogleMapsSettingsPartRecord>("GoogleMapsSettings", "Parts/GoogleMapsSettings"));
        }
于 2013-10-27T18:42:48.760 回答
0

我遇到了同样的错误,但就我而言,迁移类一切正常。原因是不幸的合并,它删除了我的驱动程序类。看看 ContentPartDriverCoordinator 类的 Activating 方法的这段代码。在我的情况下,我的内容部分没有 partInfo,结果部分变成了 ContentPart,因此强制转换会引发异常

var partInfos = _drivers.SelectMany(cpp => cpp.GetPartInfo()).ToList();

foreach (var typePartDefinition in contentTypeDefinition.Parts) {
    var partName = typePartDefinition.PartDefinition.Name;
    var partInfo = partInfos.FirstOrDefault(pi => pi.PartName == partName);
    var part = partInfo != null 
        ? partInfo.Factory(typePartDefinition) 
        : new ContentPart { TypePartDefinition = typePartDefinition };
    context.Builder.Weld(part);
}
于 2014-06-05T19:16:52.810 回答