【发布时间】:2015-02-21 09:27:38
【问题描述】:
我有一个包含可验证的模型。我想在控制器中访问那个可验证的,但我没有任何运气。谁能告诉我该怎么做?
我的模型:
public class Interspire_MailingPart : ContentPart<Interspire_MailingPartRecord>
{
[Required]
public String SubscribeFormID
{
get { return Retrieve(r => r.SubscribeFormID); }
set { Store(r => r.SubscribeFormID, value); }
}
}
public class Interspire_MailingPartRecord : ContentPartRecord
{
public virtual String SubscribeFormID { get; set; }
}
我在添加小部件时设置它们。我的迁移一切正常。
编辑: 为了澄清我想要做的事情: 我希望我的模块有 2 种不同的设置。一个将在站点级别,以便每个小部件都具有相同的。然后在小部件级别,因此您添加的每个小部件都将具有不同的设置。
我想访问我的控制器中的这两个设置。
但我只能访问全局设置,而本地设置返回一个空字符串。
控制器
public class MailControllerWebApi : ApiController
{
public MailControllerWebApi(IOrchardServices orchardServices)
{
Services = orchardServices;
T = NullLocalizer.Instance;
}
public IOrchardServices Services { get; private set; }
public Localizer T { get; set; }
public string Get(string Email) {
var localSettings = Services.WorkContext.CurrentSite.As<Interspire_MailingPart>();
var globalSettings = Services.WorkContext.CurrentSite.As<Interspire_MailingSettingsPart>();
return localSettings.SubscribeFormID;
}
}
两个处理程序:
public class MailingSettingsHandler: ContentHandler
{
public MailingSettingsHandler(IRepository<Interspire_MailingSettingsPartRecord> repository)
{
T = NullLocalizer.Instance;
Filters.Add(new ActivatingFilter<Interspire_MailingSettingsPart>("Site"));
Filters.Add(new TemplateFilterForPart<Interspire_MailingSettingsPart>("Nastavitve", "Parts/MailingSettings", "Interspire"));
Filters.Add(StorageFilter.For(repository));
}
public Localizer T { get; set; }
protected override void GetItemMetadata(GetContentItemMetadataContext context) {
if (context.ContentItem.ContentType != "Site")
return;
base.GetItemMetadata(context);
context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Interspire")));
}
}
public class MailingHandler: ContentHandler
{
public MailingHandler(IRepository<Interspire_MailingPartRecord> repository)
{
T = NullLocalizer.Instance;
Filters.Add(new ActivatingFilter<Interspire_MailingPart>("Site"));
Filters.Add(StorageFilter.For(repository));
}
public Localizer T { get; set; }
}
还有司机:
public class MailingDriver : ContentPartDriver<Interspire_MailingPart>
{
private readonly IOrchardServices _services;
public MailingDriver(INotifier notifier, IOrchardServices services)
{
_services = services;
}
protected override DriverResult Display(Interspire_MailingPart part, string displayType, dynamic shapeHelper)
{
var mailingSettings = _services.WorkContext.CurrentSite.As<Interspire_MailingSettingsPart>();
return ContentShape("Parts_Mailing",
() => shapeHelper.Parts_Mailing(
Url: mailingSettings.Url,
SubscribeFormID: part.SubscribeFormID
));
}
//GET
protected override DriverResult Editor(Interspire_MailingPart part, dynamic shapeHelper)
{
return ContentShape("Parts_Mailing_Edit",
() => shapeHelper.EditorTemplate(
TemplateName: "Parts/Mailing",
Model: part,
Prefix: Prefix));
}
//POST
protected override DriverResult Editor(Interspire_MailingPart part, IUpdateModel updater, dynamic shapeHelper)
{
updater.TryUpdateModel(part, Prefix, null, null);
return Editor(part, shapeHelper);
}
}
全局设置正常获取数据,而本地设置只返回一个空字符串。
EDIT2 迁移文件:
public int Create() {
ContentDefinitionManager.AlterTypeDefinition("InterspireMailingWidget", cfg => cfg
.WithPart("Interspire_MailingPart")
.WithPart("WidgetPart")
.WithPart("CommonPart")
.WithSetting("Stereotype", "Widget"));
SchemaBuilder.CreateTable("Interspire_MailingPartRecord", table => table
.ContentPartRecord()
.Column("SubscribeFormID", DbType.String)
);
SchemaBuilder.CreateTable("Interspire_MailingSettingsPartRecord", table => table
.ContentPartRecord()
.Column("Url", DbType.String)
);
ContentDefinitionManager.AlterPartDefinition("Interspire_MailingPart",
builder => builder.Attachable());
return 1;
}
【问题讨论】:
-
还是不清楚。您似乎所谓的本地设置只是小部件部分的属性,对吗?您是否已经引用了该小部件?
-
值得向我们展示一切都是真诚的。看来您在这里缺少一些基础知识。
-
是的,本地设置只是我的小部件部分的属性。你还需要什么?迁移?
-
我已经添加了migration.cs,我不知道你还需要什么,因为现在或多或少是所有代码。我不知道我做错了什么,但是这两个设置都被写入了数据库,我通常可以在我的视图中访问这两个设置,但我只能进入控制器中的“全局设置”。
标签: asp.net asp.net-mvc orchardcms orchardcms-1.8