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; }
    }
}

ContentPartRecord

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

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 に答える