У меня есть приложение ASP.NET Webforms, куда я загружаю несколько файлов для отправки по электронной почте с помощью ajaxFileUpload. Учитывая мою бизнес-логику, я хочу разрешить до 5 файлов на одно электронное письмо и хочу отключить селектор файлов, если предел достигнут. Я знаю, что у ajaxFileUpload есть события на стороне клиента и сервера при запуске, завершении и завершении загрузки, но поскольку файлы временно сохраняются между выборами, я бы хотел отключить селектор на клиенте внутри события OnUploadComplete (на сервере ), если загруженные файлы достигнут 5.
Я пробовал использовать
ClientScript.RegisterStartupScript(this.GetType(), "files", "$("#ajaxCargarAdjunto_SelectFileContainer")[0].style.display = "none"", false);
и
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "key", "$("#ajaxCargarAdjunto_SelectFileContainer")[0].style.display = "none"", false);
но это не запускает сценарии. Даже передал UpdatePanel и его тип методам, но ничего.
Я также пробовал использовать скрытые поля и вызывать LoadPostData(), но получаю исключение Invalid postback or callback argument.
IPostBackDataHandler textoAdjuntosCorreo = txtAdjuntosCorreo IPostBackDataHandler;
textoAdjuntosCorreo.LoadPostData(txtAdjuntosCorreo.UniqueID, Request.Params);
Событие ajaxFileUpload это
protected void ajaxCargarAdjunto_UploadComplete(object sender, AjaxFileUploadEventArgs e)
{
ClientScript.RegisterStartupScript(this.GetType(), "files", "$("#ajaxCargarAdjunto_SelectFileContainer")[0].style.display = "none"", false);
}





Вы не можете внедрять сценарии в 3 события на стороне сервера AjaxfileUpload, и причина в том, что эти 3 события НЕ имеют обратной передачи и возврата веб-страницы на сторону клиента. Чтобы использовать регистрацию сценария, веб-страница должна перейти на сервер. Страница + код запускается, включая любые инъекции скриптов, а ЗАТЕМ вся страница возвращается на сторону клиента.
Однако, поскольку AjaxFileUpLoad не выполняет обратную передачу, вы отмечаете в трех событиях на стороне сервера, которые вы не можете коснуться, см., изменить ЛЮБЫЕ элементы управления на веб-странице, которые, конечно, все еще находятся на стороне клиента. И именно поэтому вы не можете вставлять сценарии в эти три события — страница браузера все еще находится на рабочем столе пользователя.
Таким образом, эти три события на стороне сервера следует рассматривать как веб-методы, и, следовательно, они не используют веб-страницу, расположенную на стороне клиента. Таким образом, вы не сможете ни изменить элементы управления на странице, ни зарегистрировать скрипты.
Без обратной передачи страницы вы, конечно, не сможете зарегистрировать скрипты.
Однако почему бы не рассмотреть возможность установки MaxAllowedFiles?
Например это:
<ajaxToolkit:AjaxFileUpload ID = "AjaxFileUpload1" runat = "server"
OnUploadComplete = "AjaxFileUpload1_UploadComplete"
ChunkSize = "8192" MaxFileSize = "-1"
MaximumNumberOfFiles = "5"
/>
Таким образом, пользователь может выбрать максимум 5 файлов.
например это:
Теперь, конечно, после того, как пользователь выберет, скажем, 5 файлов и загрузит, счетчик сбрасывается, но опять же, вы можете запустить обратную передачу после загрузки всех файлов. Вы можете сделать это с помощью третьего и последнего побочного события «клиента» загрузки AJ, добавив обратную передачу.
На этом этапе у вас будет фактическое количество файлов, а с помощью обратной передачи вы сможете даже отключить контроль загрузки или даже скрыть его. Это действительно зависит от того, есть ли у вас после загрузки или требуется окончательный возврат страницы.
Конечно, если ваша страница не выполняет обратную отправку после 5 файлов, то при загрузке счетчик файлов сбрасывается. Я полагаю, что тогда вы могли бы просто иметь клиентскую сторону счетчика файлов. Обратите внимание, что каждое из трех событий также имеет функцию на стороне клиента, которую можно вызвать. Следовательно, теоретически вы можете просто увеличить счетчик, и если он достигнет 5 загрузок, вы отключите или «скроете» элемент управления загрузкой, предотвращая дополнительные загрузки. Это зависит от того, есть ли у вас постбек после загрузки всех файлов или нет?
Если после загрузки всех файлов не происходит обратной передачи, вам необходимо подсчитать количество загруженных файлов на стороне клиента, и это можно сделать.
Итак, произнесите эту разметку:
<asp:Label ID = "lblFilecount" runat = "server" Text = "0" ClientIDMode = "Static"></asp:Label>
<br />
<div id = "myuploader" style = "width:500px">
<ajaxToolkit:AjaxFileUpload ID = "AjaxFileUpload1" runat = "server"
OnUploadComplete = "AjaxFileUpload1_UploadComplete"
ChunkSize = "8192" MaxFileSize = "-1"
MaximumNumberOfFiles = "5"
OnClientUploadComplete = "onefiledone" />
</div>
<div id = "nomorefiles" style = "display:none">
<h3>5 files uploaded - no more files allowed</h3>
</div>
<script>
function onefiledone() {
var lblcount = $('#lblFilecount')
var fcount = parseInt(lblcount.text())
fcount += 1
lblcount.text(fcount)
if (fcount == 5) {
// no more files allowed
$('#myuploader').hide()
$('#nomorefiles').show()
}
}
</script>
Обратите внимание, что выше мы определяем событие OnClientUploadComplete. Кроме того, это небольшая «причуда», поскольку вы НЕ включаете () для вызова функции js на стороне клиента.
Следовательно, мы сейчас видим это:
Итак, обратите внимание, что существуют условия для вызова js-кода на стороне клиента. По мере загрузки каждого файла мы увеличиваем значение метки, а когда мы достигаем 5 файлов, мы просто скрываем область div, показывающую загрузчик, а затем показываем простой элемент div с сообщением внутри.