ASP.NET MVC3 Отправка нескольких форм с одной страницы - PullRequest
3 голосов
/ 28 июля 2011

Существуют похожие посты, но, похоже, они не отражают мою ситуацию.Заранее извиняюсь, если это повторная публикация.

Я вижу, как

@FileUpload.GetHtml(initialNumberOfFiles:1,allowMoreFilesToBeAdded:true,includeFormTag:true, uploadText: "Upload" )

@model IEnumerable<EpubsLibrary.Models.Partner>
@{ using (Html.BeginForm("Index","Epub")) 
   {
        @Html.DropDownList("PartnerID", (IEnumerable<SelectListItem>)ViewBag.Partners, "None")
        <input type="submit" value="send" id="pickPartner" hidden="hidden"/>
   }        
}

<script type="text/javascript">
    $(".file-upload-buttons input").click(function () {
        $("#pickPartner").click();
    });
</script>

мой контроллер

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> fileUpload, FormCollection collection)
{
    int selectedPartner, count =0;
    //int selectedPartner = int.Parse(collection["PartnerID"]);
    if(!int.TryParse(collection["PartnerID"], out selectedPartner))
    {
        selectedPartner = 0;
        ModelState.AddModelError("", "You must pick a publishing agency");
    }
    IList<Partner> p = r.ListPartners();
    ViewBag.Partners = new SelectList(p.AsEnumerable(), "PartnerID", "Name", selectedPartner);

    //make sure files were selected for upload 
    if (fileUpload != null)
    {
        for (int i = 0; i < fileUpload.Count(); i++)
        {
            //make sure every file selected != null
            if (fileUpload.ElementAt(i) != null)
            {
                count++;
                var file = fileUpload.ElementAt(i);
                if (file.ContentLength > 0)
                {
                    var fileName = Path.GetFileName(file.FileName);
                    // need to modify this for saving the files to the server
                    var path = Path.Combine(Server.MapPath("/App_Data/uploads"), Guid.NewGuid() + "-" + fileName);
                    file.SaveAs(path);
                }
            }
        }
    }

    if (count == 0)
    {
        ModelState.AddModelError("", "You must upload at least one file!");
    }
    return View();
}

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

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

Хорошо. Я обновил представление с помощью

@model IEnumerable<EpubsLibrary.Models.Partner>
@{ using (Html.BeginForm("Index","Epub")) 
   {
        @Html.DropDownList("PartnerID", (IEnumerable<SelectListItem>)ViewBag.Partners, "None")
        @FileUpload.GetHtml(initialNumberOfFiles: 1, allowMoreFilesToBeAdded: true, includeFormTag: false, uploadText: "Upload")
        <input type="submit" value="send" id="pickPartner"/>
   }        
}

Но теперь данные файла больше не передаются.

- Обновление -

Я внес следующие изменения.Теперь представление выглядит как

@model IEnumerable<EpubsLibrary.Models.Partner>
@{ using (Html.BeginForm("Index", "Epub", new { enctype = "multipart/form-data" }))
   {
        @Html.DropDownList("PartnerID", (IEnumerable<SelectListItem>)ViewBag.Partners, "None")
        @FileUpload.GetHtml(initialNumberOfFiles: 1, allowMoreFilesToBeAdded: true, includeFormTag: false, uploadText: "Upload")
        <input type="submit" value="send" id="pickPartner"/>
   }        
}

и контроллер

[HttpPost]
        public ActionResult Index(IEnumerable<HttpPostedFileBase> fileUpload, int PartnerID = 0)
        //public ActionResult Index(IEnumerable<HttpPostedFileBase> fileUpload, FormCollection collection)
        {
            int count =0;
            IList<Partner> p = r.ListPartners();
            ViewBag.Partners = new SelectList(p.AsEnumerable(), "PartnerID", "Name", PartnerID);
            //make sure files were selected for upload 
            if (fileUpload != null)
            {
                for (int i = 0; i < fileUpload.Count(); i++)
                {
                    //make sure every file selected != null
                    if (fileUpload.ElementAt(i) != null)
                    {
                        count++;
                        var file = fileUpload.ElementAt(i);
                        if (file.ContentLength > 0)
                        {
                            var fileName = Path.GetFileName(file.FileName);
                            // need to modify this for saving the files to the server
                            var path = Path.Combine(Server.MapPath("/App_Data/uploads"), Guid.NewGuid() + "-" + fileName);
                            file.SaveAs(path);
                        }
                    }
                }
            }

            if (count == 0)
            {
                ModelState.AddModelError("", "You must upload at least one file!");
            }
            return View();
        }
    }

Я пытаюсь выяснить, как данные файла передаются в сообщении (если оно есть), поэтому яможете сохранить файлы.

- Окончательное обновление с ответом -

Ну, проблема оказалась двукратной. 1-й вопрос с @FileUpload и необходимо установить includeFormTag: false

Другая проблема, которую я обнаружил, заключалась в том, что мне нужно было убедиться, что в моем @Html.BeginForm я включил FormMethod.Post Это было обнаружено, когда счетчик fileUpload возвращался к 0. Я запустил профилировщик на firebug, и он указал, что данные файлана самом деле не публикуется.Вот исправленный код ниже.

мой взгляд

@model IEnumerable<EpubsLibrary.Models.Partner>
@{ using (Html.BeginForm("Index", "Epub", FormMethod.Post, new { enctype = "multipart/form-data" }))
   {
        @Html.DropDownList("PartnerID", (IEnumerable<SelectListItem>)ViewBag.Partners, "None")
        @FileUpload.GetHtml(initialNumberOfFiles: 1, allowMoreFilesToBeAdded: true, includeFormTag: false, uploadText: "Upload")
        <input type="submit" value="send" id="pickPartner"/>
   }        
} 

мой контроллер

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> fileUpload, int PartnerID = 0)        
{
    int count =0;
    IList<Partner> p = r.ListPartners();
    ViewBag.Partners = new SelectList(p.AsEnumerable(), "PartnerID", "Name", PartnerID);
    //make sure files were selected for upload 
    if (fileUpload != null)
    {
        for (int i = 0; i < fileUpload.Count(); i++)
        {
            //make sure every file selected != null
            if (fileUpload.ElementAt(i) != null)
            {
                count++;
                var file = fileUpload.ElementAt(i);
                if (file.ContentLength > 0)
                {
                    var fileName = Path.GetFileName(file.FileName);
                    // need to modify this for saving the files to the server
                    var path = Path.Combine(Server.MapPath("/App_Data/uploads"), Guid.NewGuid() + "-" + fileName);
                    file.SaveAs(path);
                }
            }
        }
    }

    if (count == 0)
    {
        ModelState.AddModelError("", "You must upload at least one file!");
    }
    return View();
}

Спасибо @Jay и @Vasile Bujac за вашу помощь в этом.

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Установите для IncludeFormTag значение false и поместите его в другую форму using.

@model IEnumerable<EpubsLibrary.Models.Partner>
@{ using (Html.BeginForm("Index","Epub")) 
   {
        @FileUpload.GetHtml(initialNumberOfFiles:1,allowMoreFilesToBeAdded:true,includeFormTag:false, uploadText: "Upload" )

        @Html.DropDownList("PartnerID", (IEnumerable<SelectListItem>)ViewBag.Partners, "None")
        <input type="submit" value="send" id="pickPartner" hidden="hidden"/>
   }        
}

Обновление: Попробуйте изменить подпись вашего представления на это:

public ActionResult Index(IEnumerable<HttpPostedFileBase> fileUpload, int PartnerID = 0)

Проверьте перегрузки для FileUpload.GetHtml и посмотрите, есть ли параметр для установки имени поля для загрузки вашего файла. Раньше это были только загружаемые файлы, теперь их файлы и параметр, поэтому наименование становится более важным.

0 голосов
/ 28 июля 2011

Вы должны использовать ту же форму для выпадающего списка и ввода файлов. Это можно сделать, поместив помощник FileUpload внутри формы и установив для параметра «includeFormTag» значение false.

@model IEnumerable<EpubsLibrary.Models.Partner>
@using (Html.BeginForm("Index","Epub")) {
        @FileUpload.GetHtml(initialNumberOfFiles:1,allowMoreFilesToBeAdded:true,includeFormTag:false, uploadText: "Upload" )
        @Html.DropDownList("PartnerID", (IEnumerable<SelectListItem>)ViewBag.Partners, "None")
        <input type="submit" value="send" id="pickPartner" hidden="hidden"/>
   }        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...