У меня недавно была такая же проблема. Я новичок в шаблоне приложения динамических данных и был быстро впечатлен его готовой функциональностью. Однако я также отметил несколько неудач, в частности ту, которую вы упомянули. Несколько моих страниц загружались вечно, и когда я обнаружил, что это было вызвано заполнением внешнего ключа, мне потребовалось некоторое время, чтобы найти решение.
Проблема заключается в том, что это поведение важно для внутренней работы веб-сайта. Эти выпадающие списки внешнего ключа фактически управляют набором результатов в сетке данных. (Список ddlist заполняется, затем устанавливается значение по умолчанию, которое вызывает событие для фильтрации сетки данных.) Поэтому ключ заключается в том, чтобы изменить это поведение вместо того, чтобы отключать его.
Моя первая подсказка в решении этой проблемы пришла из отличной серии блогов, которые я нашел в Интернете. Слава Стивену Нотону
Идея состоит в том, чтобы создать атрибут metacolumn и украсить проблемные объекты в ваших метатируемых частичных классах. (Я назвал мой DisableFilter)
Итак, в итоге вы получите таблицу и метатическое определение частичного класса, подобное:
[MetadataType(typeof(InvoiceMetadata))]
public partial class Invoice {
}
public partial class InvoiceMetadata {
[ScaffoldColumn(false)]
public string InvoiceId { get; set; }
[ScaffoldColumn(false)]
public string LiquidatorInvoiceId { get; set; }
[ScaffoldColumn(false)]
public string CreatedBy { get; set; }
[ScaffoldColumn(false)]
public System.Nullable<System.DateTime> LastModifiedDate { get; set; }
[ScaffoldColumn(false)]
public string LastModifiedBy { get; set; }
[DisableFilter]
public LeadAccount LeadAccount { get; set; }
}
Мой недавно созданный атрибут DisableFilter украшает коллекцию LeadAccount (наша таблица контактов).
После оформления столбца я изменил базовое поведение элемента управления ForeignKey.ascx, добавив проверку нового атрибута. Если фильтр отключен, я только заполняю список ddlist элементом по умолчанию.
if (!Page.IsPostBack) {
if (!Column.IsRequired) {
DropDownList1.Items.Add(new ListItem("[Not Set]", NullValueString));
}
if (Column.IsFilterDisabled()) {
DropDownList1.Items.Add(new ListItem(DefaultValue, DefaultValue));
}
else {
PopulateListControl(DropDownList1);
}
// Set the initial value if there is one
string initialValue = DefaultValue;
if (!String.IsNullOrEmpty(initialValue)) {
DropDownList1.SelectedValue = initialValue;
}
}
}
Это не совсем то, что я называю полным решением, в основном значение фильтра не будет содержать понятного имени. Я еще не удосужился решить эту проблему, но это должно сделать вас на шаг ближе к решению вашей проблемы.