创建UI以管理Kentico中自定义模块中的多个类之间的关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建UI以管理Kentico中自定义模块中的多个类之间的关系相关的知识,希望对你有一定的参考价值。
我正在尝试在Kentico(Kentico 10)数据库中存储和管理一些关系数据。我无法将其融入Kentico的最佳实践中。
我有以下数据: 1.公司 - 公司名单 2. PostalCode - 国际邮政编码列表,其国家和纬度/经度 3. CompanyPostalCodes - 每个公司提供的多对多邮政编码表以及描述公司如何提供邮政编码的布尔标志(邮政编码是服务/交付区域)
我已经阅读了creating custom modules上的文档,并成功创建了一个模块,类和UI来管理公司和邮政编码。 我还阅读了关于creating a binding class的文档,并创建了一个。 (我也在那里添加了前面提到的布尔字段。)
我坚持尝试创建一个UI来管理它们之间的多对多关系。理想情况下,我可以从编辑公司页面中选择多个邮政编码(以及邮政编码表中尚不存在的邮政编码中的密钥)。我还需要能够在给定公司的编辑页面上为每个邮政编码设置标志字段。 (如果这过于复杂,我可以使用带有标志的邮政编码标签和没有标签的另一个标签。)但我对如何管理UI中的关系有任何建议。
有什么建议?
如果您的绑定对象不仅仅是对两个表的引用(它有字段),那么这里有几个选项。
首先确保您在公司的编辑是ui页面类型垂直列表,并在其下添加类型编辑对象的“常规”页面,以及您的绑定UI。然后...
- 使用绑定UI模板,但扩展ui并调整列表以指向具有编辑功能的自定义unigrid xml,这样您不仅可以添加绑定,还可以编辑该对象。
- 做#1除了修改unigrid以使复选框有额外的列,更改那些列呈现所以它返回一个复选框对象(标志复选框)并向标题添加一个保存按钮(所有可通过ui扩展器执行)循环遍历项目并使用复选框保存公司邮政)
- 有一个单独的对象列出UI页面,它是绑定对象上的对象列表,因此您有一个用于创建绑定,另一个用于编辑它们。请注意,有时您无法选择对象,因为它是属性中的绑定对象,您需要单击下拉列表旁边的黑色箭头并手动键入类。
- 创建一个完全自定义的对象列表或扩展的unigrid,并根据需要执行。
我已经完成了所有4个人,#2可能是最复杂但最顺畅的管理。如果你想选择一个你想要的,我可以提供一些样品!
-------------------编辑-------------------
再看看,#2你无法真正扩展保存功能,我不得不去自定义路线(#4)来拥有一个具有可以在保存时检索的可变字段的UniGrid。
这是守则
// ASCX
<!-- DO NOT Arranged or add to the columns without adjusting the back end code, as it references by index -->
<div class="GridContent">
<cms:UniGrid EnableTheming="true" ShowActionsMenu="false" ShowActionsLabel="false" ShowExportMenu="false" ShowObjectMenu="false" runat="server" ID="gridSizes" OrderBy="enabled desc, SizeOrder" AllColumns="SizeID, Enabled, SizeDisplayName, PriceAdjustment, Upcharge, VendorUpcharge" ApplyPageSize="false" PageSize="##ALL##">
<GridActions Enabled="false" />
<GridColumns>
<ug:Column runat="server" Source="SizeID" Caption="SizeID" CssClass="hidden" AllowSorting="false" />
<ug:Column runat="server" Source="Enabled" Caption="Enabled" ExternalSourceName="Enabled" AllowSorting="false" />
<ug:Column runat="server" Source="SizeDisplayName" CssClass="DisplayName" Caption="Size Display Name" AllowSorting="false" />
<ug:Column runat="server" Source="Upcharge" Caption="Upcharge" ExternalSourceName="Upcharge" AllowSorting="false" />
<ug:Column runat="server" Source="VendorUpcharge" Caption="Vendor Upcharge" ExternalSourceName="VendorUpcharge" AllowSorting="false" />
</GridColumns>
<PagerConfig ShowPageSize="false" ShowDirectPageControl="false" PageSizeOptions="##ALL##" runat="server" Visible="false" />
</cms:UniGrid>
</div>
<cms:FormSubmitButton runat="server" ID="btnSaveItems" OnClick="btnSave_Click" />
// Code Behind
private void SetSizesTable()
{
QueryDataParameters parameters = new QueryDataParameters();
parameters.Add("@SkuID", GetSkuID());
int totalRecords = 0;
DataSet ds = YourDataCallHere;
gridSizes.DataSource = ds;
gridSizes.OnExternalDataBound += GridSizes_OnExternalDataBound;
gridSizes.DataBind();
}
private object GridSizes_OnExternalDataBound(object sender, string sourceName, object parameter)
{
// Replace the Enabled and Upcharge with actual controls, this way the user can adjust them
// and then those values retrieved when saved.
switch(sourceName.ToLower())
{
case "enabled":
var enabled = ValidationHelper.GetBoolean(parameter, false);
CheckBox cbxEnabled = new CheckBox();
cbxEnabled.Checked = enabled;
cbxEnabled.TabIndex = 100;
return cbxEnabled;
case "upcharge":
case "vendorupcharge":
var price = ValidationHelper.GetDecimal(parameter, 0);
CMSTextBox txtBox = new CMSTextBox();
txtBox.Text = price.ToString("F2");
txtBox.TabIndex = 1000;
return txtBox;
default:
return parameter;
}
}
// Save logic here
protected void btnSave_Click(object sender, EventArgs e)
{
// Loop through the actual control rows so we can retrieve the values and update.
ControlFinder<GridViewRow> GridViewRowFinder = new ControlFinder<GridViewRow>();
GridViewRowFinder.FindChildControlsRecursive(gridSizes);
bool ErrorOccurred = false;
// Skip the first and last as they are the header / action rows
foreach (GridViewRow RowItem in GridViewRowFinder.FoundControls.Skip(1).Take(GridViewRowFinder.FoundControls.Count()-2))
{
try
{
// Retrieve the values from the controls. These are based on the Cell index so any modification to the
// UniGrid may break this and need updating!
int SizeID = ValidationHelper.GetInteger(((LiteralControl)RowItem.Cells[1].Controls[0]).Text, -1);
bool isChecked = ((CheckBox)RowItem.Cells[2].Controls[0]).Checked;
decimal Upcharge = ValidationHelper.GetDecimal(((CMSTextBox)RowItem.Cells[4].Controls[0]).Text, 0);
decimal VendorUpcharge = ValidationHelper.GetDecimal(((CMSTextBox)RowItem.Cells[5].Controls[0]).Text, 0);
if (Upcharge > 0 || VendorUpcharge > 0)
{
isChecked = true;
}
// Grab any existing Sku Size
var ExistingSkuSize = SkuSizeInfoProvider.GetSkuSizeInfo(GetSkuID(), SizeID);
// Update the Sku Size
if (!isChecked && ExistingSkuSize != null)
{
// Delete existing since unchecked
ExistingSkuSize.Delete();
}
else if (isChecked && ExistingSkuSize == null)
{
// Create new one since it does not exist
SkuSizeInfo newSkuSize = new SkuSizeInfo();
newSkuSize.SkuID = GetSkuID();
newSkuSize.SizeID = SizeID;
newSkuSize.Upcharge = Upcharge;
newSkuSize.VendorUpcharge = VendorUpcharge;
newSkuSize.SkuSizeGuid = Guid.NewGuid();
newSkuSize.SkuSizeLastModified = DateTime.Now;
newSkuSize.Insert();
}
else if (isChecked && (ExistingSkuSize.Upcharge != Upcharge || ExistingSkuSize.VendorUpcharge != VendorUpcharge))
{
// Just update the upcharge
ExistingSkuSize.Upcharge = Upcharge;
ExistingSkuSize.VendorUpcharge = VendorUpcharge;
ExistingSkuSize.Update();
}
} catch(Exception ex)
{
ErrorOccurred = true;
EventLogProvider.LogException("ProductSizes", "UPDATEERROR", ex, additionalMessage: string.Format("Unable to Set/Update the Sku Size for SkuID {0}, this could be because the grid was altered.", GetSkuID()));
}
}
if(ErrorOccurred)
{
AddWarning("An error occured on some items while saving, please check the Event Log.");
} else
{
AddConfirmation("Product Sizes Updated.");
// Force refresh as otherwise it messes up
URLHelper.Redirect(HttpContext.Current.Request.Url.PathAndQuery);
}
}
}
以上是关于创建UI以管理Kentico中自定义模块中的多个类之间的关系的主要内容,如果未能解决你的问题,请参考以下文章
Kentico,带有用于上传 CSV 的 Web 部件的模块