Есть ли какой-либо собственный путь в ASP.NET, чтобы сделать “сообщение успеха”?

Не удалось создать экземпляр отношений. ViewModels.AddGameViewModel. Сложные типы, связанные с моделью, не должны быть абстрактными или значениями и должны иметь конструктор без параметров.

Давайте попробуем устранить эту ошибку.

Не удалось создать экземпляр отношения .ViewModels.AddGameViewModel.

Довольно очевидно: компоненты привязки к модели пытаются создать экземпляр вашего типа, но не удалось.

Связанные с моделью сложные типы

«Связанный с моделью» означает, что они связаны конвейером ASP.NET. «сложные типы» - это в основном любые типы, которые не являются «базовыми», например string или int. Ваши модельные классы являются сложными типами.

не должно быть абстрактным

Система привязки модели захочет иметь возможность создавать экземпляры класса, поэтому она не может быть абстрактной; это должно быть конкретным. Все типы, которые вы показываете, являются конкретными, так что это не проблема.

или типы значений

Нельзя использовать типы struct с привязкой к модели; это только одно из его ограничений. К счастью, все ваши типы - это классы, так что вы можете игнорировать это.

и должен иметь конструктор без параметров.

ASP.NET не знает, как передавать параметры конструкторам моделей. Он может делать только эквивалент new T(), поэтому все типы вашей модели должны определять конструктор с нулевыми параметрами. Это причина, по которой вы видите ошибку; ваш класс AddGameViewModel определяет только этот конструктор:

public AddGameViewModel(IEnumerable<GameCategory> categories)

Одна из особенностей языка C # заключается в том, что, когда вы не указываете конструктор вручную, он добавляет для вас конструктор по умолчанию. Когда вы определяете конструктор в своем коде, этот конструктор по умолчанию не добавляется.

Во всех других ваших моделях вы не определяете никаких конструкторов, поэтому компилятор добавляет для вас модель по умолчанию. В случае AddGameViewModel вы добавили конструктор, поэтому для решения проблемы вы также должны добавить конструктор по умолчанию:

public AddGameViewModel()
{
}
9
задан Hamish Smith 19 December 2008 в 19:58
поделиться

4 ответа

Насколько я знаю, нет никакого собственного способа сделать это. Можно разглагольствовать об этом, возможно, Microsoft услышит его :).

При сбросе "успеха не будет работать сообщение" на Page_Load, или везде, где в коде - позади. Это вызвано тем, что проверка ASP.NET обычно делается и клиент и серверная сторона. Это означает для каждой проверки, управляют Вами, ставит страницу, ASP.NET генерирует некоторый клиентский JavaScript, который делает проверку и представляет ошибку на клиенте, не возвращаясь к серверу. Таким образом, Вы застреваете и с сообщением успеха и с сообщением об ошибке одновременно.

Что можно делать с этим:

  • место a <div> управляйте на своей странице, которая разоблачила бы сообщение успеха (как уже предложили другие выше). Каждый раз, когда Вы обновляете что-то (в серверном коде), разоблачаете управление и устанавливаете значимое, "Успешное!" текст сообщения.
  • зарегистрируйте пользовательскую функцию JavaScript, которая была бы поиск <div> и скройтесь, это на каждой странице отправляет. Знайте, что функция должна быть вызвана перед автоматически сгенерированным клиентским сценарием, который делает проверку.

Если Вы смотрите на клиентский источник страницы ASP.NET (с блоками проверки допустимости на нем), вот то, что можно найти:

<form name="aspnetForm" method="post" action="MyPage.aspx" onsubmit="javascript:return WebForm_OnSubmit();id="aspnetForm">

WebForm_OnSubmit сгенерирован ASP.NET и называет JavaScript, который делает проверку. Образец:

function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false)
    return false;
return true;
}

Для регистрации пользовательского кода, который скрывает сообщение успеха необходимо поместить (в код - позади) что-то вдоль этих строк:

if (!Page.ClientScript.IsOnSubmitStatementRegistered("ClearMessage"))
{
    string script = @"document.getElementById('" + 
        yourDivControl.ClientID + "').style.display='none'";
    Page.ClientScript.RegisterOnSubmitStatement(Page.GetType(), "ClearMessage", script);
}

Это перевернет Вашу страницу, автоматически сгенерировал WebForm_OnSubmit в следующее:

function WebForm_OnSubmit() {
    document.getElementById('ctl00_yourDivControl').style.display='none';
    if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false)
        return false;
    return true;
}

Эффект: На каждой обратной передаче (например, когда ItemCommand инициирован, или когда некоторая кнопка Save нажата, или что-либо еще), Вы разоблачите управление отделения с сообщением "успеха". На следующей обратной передаче, прежде, чем отправить страницу серверу, очищено это сообщение. Конечно, если эта обратная передача также инициировала "успех", сообщение показывает снова код - позади на сервере. И т. д. и т. п.

Я надеюсь, что вышеупомянутое полезно. Это не полноценное решение, но это дает достаточные подсказки для указания на Вас в правильном направлении.

7
ответ дан 4 December 2019 в 21:52
поделиться

Используйте событие ItemCommand и выполните сброс для очистки состояния для каждой команды, которая дана. Затем, если сбои проверки на обновлении, ошибка проверки будет отображена. Если это успешно выполнится, то это покажет сообщение успеха. Последующие, нажатия кнопок вызовут событие ItemCommand, и можно сбросить снова для запуска новый.

1
ответ дан 4 December 2019 в 21:52
поделиться

Daniel, мне было нужно что-то подобное, таким образом, я произошел из Маркировки и связал ее непосредственно с событиями, сгенерированными различными производными DataSourceControl (LinqDataSource, ObjectDataSource, SqlDataSource). Я также использовал клиентский JavaScript для сокрытия маркировки во время проверки и/или представления формы (как Dan. Ответ C).

Управление выставляет отдельные свойства текста сообщения для Удаленного успешного, события Inserted и Updated.

Я опубликовал прокомментированный источник для решения по http://codehq.net/files/UpdateSuccessMessage.zip

Надеюсь, это поможет.

1
ответ дан 4 December 2019 в 21:52
поделиться

Почему бы не выключить сообщение проверки в Page_Load. Я предполагаю, что, если бы сообщение назад происходит, Вы хотели бы избавиться от сообщения, так удостоверьтесь, что это всегда выключено. Или отключите состояние отображения для управления установкой EnableViewState = "Ложь" в разметке (aspx страница).

Так:

protected void ClearMessages(object sender, DetailsViewCommandEventArgs e)
{
    successMessage.InnerText = string.Empty;    
    successMessage.Visible = false;
}

становится:

protected void Page_Load(object sender, EventArgs e)
{
    successMessage.InnerText = string.Empty;    
    successMessage.Visible = false;

}

Также как примечание стороны, если Вы buiding сайты .NET необходимо получить comftorble с кодом behinds IMHO:-),

0
ответ дан 4 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: