MVC3 Razor: как сделать частичный вид условно загруженным? - PullRequest
1 голос
/ 08 ноября 2011

Я новичок в MVC3 и все еще учусь.Я пытаюсь написать приложение (MVC3 с Razor), которое позволяет пользователю выбирать файлы и загружать / сохранять.Во время загрузки / сохранения я хочу просто показать «ждать» текст как частичное представление.У меня проблема, так как частичное представление загружается, как только веб-приложение запускается, и я получил ошибку от HomeController - метод [HTtpPost] Wait, так как он не может отследить список файлов в задании объекта.Конечно, список файлов будет заполнен после загрузки.Я не знаю, как решить эту проблему, и мне нужна ваша помощь.Заранее спасибо.

Мой HomeController.cs :

    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> attachments)
    {
        foreach ( var file in attachments )
        {
            // do something
        }
        return RedirectToAction("Wait");
    }

    public ActionResult Wait()
    {
            // do something
            ViewBag.Message = "Wait...";
            return View();
    }

    [HttpPost]
    public ActionResult Wait(FormCollection formCollection)
    {
        Work job = MvcApplication.GetWork();
        if ( job.Files.Any() )
        {
            return RedirectToAction("SubmitWork");
        }
        else
        {
            return View();
        }
    }

Просмотр Index.cshtml :

@{
ViewBag.Title = "FirstTry";
}
<p>
<div id="AddFiles">
    @Html.Partial("_AddFiles")
</div>
</p>

<div id ="Wait">
    @Html.Partial("_Wait")
</div>

Частичное представление _Wait.cshtml :

@{
ViewBag.Title = "Wait...";
}
@ViewBag.Message
@using ( Html.BeginForm("Wait", "Home", FormMethod.Post, new
{
    id = "waitform"
}) )
{
}
<script type="text/javascript">
    window.setTimeout("document.getElementById('waitform').submit()", 1000); 
</script>

Частичное представление _AddFiles.cshtml :

@using ( Html.BeginForm("UploadFile", "Home", FormMethod.Post, new{id = "uploadForm", enctype = "multipart/form-data"}) ) 
{
    @(Html.Telerik().Upload().Name("attachments").Multiple(true)
        .Async(async => async.AutoUpload(true) )
    )

    <input type="submit" value="Send" class="t-button" />
    <input type="reset" value="Reset" class="t-button" />
}

1 Ответ

1 голос
/ 08 ноября 2011

MVC не работает как WebForms, события на стороне клиента не распространяются на серверные элементы управления (на самом деле нет даже элементов управления, я думаю, что Telerik немного размывает эту строку и усложняет работу MVC).

Вы можете вызывать дополнительные действия в вашем контроллере для загрузки HTML, JSON или чего-то еще, но единственный способ на стороне клиента поменять HTML без изменения страницы (поскольку идет загрузка) - использовать javascript.

Я не знаком с этим элементом управления Telerik, но я думаю, что вам придется что-то делать на стороне клиента, а не на стороне сервера, чтобы указать ход загрузки или показать счетчик.

Их API показывает, что есть событие onupload, которое вы можете прослушать, и возможный обмен на загрузочный div:

http://www.telerik.com/help/aspnet-mvc/telerik-ui-components-upload-client-api-and-events.html

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

...