Не удается вернуть ActionResult из метода при использовании приложения Uploadify MVC3

#jquery #debugging #asp.net-mvc-3 #uploadify

#jquery #отладка #asp.net-mvc-3 #uploadify

Вопрос:

Если я использую это в качестве действия моего контроллера … СБОЙ.

     [HttpPost]
    public ActionResult Index(HttpPostedFileBase FileData)
    {
        var saveLocation = Path.Combine(Server.MapPath("\"),"returns");
        System.IO.Directory.CreateDirectory(saveLocation);
        FileData.SaveAs(Path.Combine(saveLocation, FileData.FileName));
        ViewBag.Message = String.Format("File name: {0}, {1}Kb Uploaded Successfully.", FileData.FileName, (int)FileData.ContentLength / 1024); 
        return View();
    }
  

Когда я запускаю свое веб-приложение и пытаюсь загрузить файл, я получаю индикатор выполнения, который работает, достигает случайного процента, затем возвращает общую ошибку.

введите описание изображения здесь

Однако!!

Это действие контроллера работает идеально.

          [HttpPost]
         public String Upload(HttpPostedFileBase FileData)
         {
             var saveLocation = Path.Combine(Server.MapPath("\"),"returns");
             System.IO.Directory.CreateDirectory(saveLocation);
             FileData.SaveAs(Path.Combine(saveLocation,FileData.FileName));
             ViewBag.Message = String.Format("File name: {0}, {1}Kb Uploaded Successfully.", FileData.FileName, (int)FileData.ContentLength / 1024);
             return ViewBag.Message; 
         }
  

Вот код с моей страницы загрузки. Все ссылки на скрипты загружены в site.master.

 <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>



<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%: ViewBag.Message %></h2>
    <%= this.Profile.TaxPayerID  %>
    <p>Please upload your return</p>   
<script type="text/javascript">
    $(document).ready(
    function () {
        $("#fileuploader").fileUpload({
            'uploader': '/Scripts/uploader.swf',
            'cancelImg': '/Images/cancel.png',
            'buttonText': 'Select DR405',
            'script': 'Home/Upload',
            'folder': '/returns',
            'fileDesc': 'Image Files',
            'fileExt': '*.csv;*.txt;*.xls;*.xlsx',
            'auto': true
        });
    }
);
    </script>

<div id="fileuploader"></div>
</asp:Content>
  

Почему я не могу вернуть ActionResult?

Комментарии:

1. Извините, я не вижу разницы между действием контроллера, которое вы отметили как работающее, и тем, которое вы отметили как не работающее.

2. @Jay — Борясь с форматированием SO, я случайно вставил одно и то же дважды

Ответ №1:

Замечаю здесь несколько вещей. Не уверен, почему в вашем приложении MVC3 есть теги asp и заголовок объявления страницы. Для uploadify требуется входной тег type =»file» с уникальным идентификатором на странице, но ваш пример указывает на тег div. Попробуйте изменить это на <input type="file"/> тег.

Комментарии:

1. Я не выбирал использовать механизм просмотра Razor. Пожалуйста, обратите внимание, что в моем вопросе я указываю, что их приложение работает нормально. Я хотел бы знать, ПОЧЕМУ возврат ActionResult вместо String вызывает сбой. Я хотел бы узнать больше, проблема не устранена.

2. Единственное предположение, которое у меня есть относительно того, почему это не работает, заключается в том, что апплет shockwave ожидает возврата определенного типа контента. При отправке строки обратно типом mime будет ‘text / plain’, где в качестве представления будет ‘text / html’.

Ответ №2:

Типичный обработчик загрузки ( ashx версия) для uploadify делает что-то вроде этого:

 //  if the file was saved successfully...
{
    context.Response.Write("1");
}
else
{
    // Let client know about failure
    context.Response.Write("0");
}
  

Это означает, что клиентский загрузчик ожидает ответа, который представляет собой либо простую текстовую строку 1, либо 0, чтобы сообщить, удалось ли это. Это, вероятно, самый простой возврат, с которым они могли бы работать.

Эквивалентом в MVC является возврат строки «0» или «1» в ответ на успешное сохранение. Это означает, что вам нужен простой возвращаемый тип string . Если вы возвращаете ‘View()’ в качестве ActionResult клиентского загрузчика, он возвращает всю HTML-страницу с сервера и не знает, что с ней делать (отсюда ошибка).

Если бы вы посмотрели рабочую и нерабочую версии в Fiddler2 (настоятельно рекомендуется), вы бы сразу увидели разницу.