Как создать пользовательский элемент управления ASP.NET MVC с неизвестным типичным параметром типа?

66
3

В настоящее время я использую базовый класс для некоторых классов модели клиентов. Как определено ниже


public abstract class BaseCustomerModel<T>
where T : IUserEntity

Для дальнейшего уточнения IUserEntity содержит:


public interface IUserEntity
{
string ErrorMessage { get; }
}

Это свойство среди других вещей будет показано в ErrorTextControl.ascx:


<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<(...).Models.BaseCustomerModel<(...).IUserEntity>>" %>

<tr>
<td colspan="2"><%: Html.DisplayFor(model => model.ErrorMessage) %></td>
</tr>


Я вызову пользовательский элемент управления следующим образом:


<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<(...).Models.MyUserModel>" %>
<% if (Model.HasErrors)
{
Html.RenderPartial("ErrorTextControl", Model);
} %>

Последний фрагмент кода (MyUserEntity реализует IUserEntity):


public class MyUserModel : BaseCustomerModel<MyUserEntity>

К сожалению, это, очевидно, не работает, потому что общий тип не может быть неявно передан в IUserEntity. Поэтому в браузере появляется следующее сообщение об ошибке:


Сведения об исключении: System.InvalidOperationException: элемент модели, переданный в словарь, имеет тип '(...). Model.MyUserModel', но для этого словаря требуется элемент модели типа  "(...). Models.BaseCustomerModel`1 [(...). IUserEntity].



Итак, вопросы:


    Есть ли способ определить пользовательский элемент управления с общим базовым классом, из которого тип еще не известен? Если да, то как это сделать?
    Если нет, обходное решение, общее решение или идеи, чтобы иметь общий пользовательский контроль?

Большое спасибо.

спросил(а) 2010-12-09T13:01:00+03:00 9 лет, 7 месяцев назад
1
Решение
55

Ну, просто придумал решение.


Просто дополнительный интерфейс к BaseCustomerModel:


public abstract class BaseCustomerModel<T> : IContainErrorMessage
where T : IUserEntity

Таким образом, пользовательский элемент управления не должен беспокоиться о дженериках:


<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<(...).Models.IContainErrorMessage>" %>

ответил(а) 2010-12-09T13:11:00+03:00 9 лет, 7 месяцев назад
56

Вы можете попробовать следующее:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>

ответил(а) 2010-12-09T14:15:00+03:00 9 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема