POSTing к действию с файлами и параметром в ASP.NET MVC3 - PullRequest
0 голосов
/ 12 января 2012

Это дополнительный вопрос к ASP.NET MVC 3 - Загрузка файла . У меня есть синтаксис URL, который я не могу изменить. Мне нужно загрузить файлы на URL в синтаксисе "/ person / {personID} / files". В настоящее время я пытаюсь следующее:

index.html

<form action="/person/2/files" method="post" enctype="multipart/form-data">
    <div>Please choose a file to upload.</div>
    <div><input id="fileUpload" type="file" /></div>

    <div><input type="submit" value="upload" /></div>
</form>

Значение параметра personID динамически заполняется при загрузке формы. Независимо от того, когда я нажимаю «загрузить», я отправляю сообщение о следующем действии:

UploadController.cs

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UploadFile(int uniqueID)
{
  foreach (string file in Request.Files)
  {
    // Request.Files is empty
  }

  return View();
}

Как разместить POST и коллекцию файлов, и параметр, используя синтаксис URL "/ person / {personID} / files"? Я знаю, что это очень конкретный запрос. У меня закончилось время на моем проекте, и я совершенно сбит с толку, почему подход, который я использую, не работает. Может кто-нибудь, пожалуйста, помогите мне?

Большое спасибо.

1 Ответ

6 голосов
/ 12 января 2012

Предполагая, что у вас есть маршрут, определенный для этого пользовательского URL:

routes.MapRoute(
    "Upload",
    "person/{uniqueid}/files",
    new { controller = "Upload", action = "UploadFile" }
);

, вам просто нужно дать входному файлу имя:

<div><input id="fileUpload" type="file" name="file" /></div>

Также я бы порекомендовал вам использоватьАргументы действия вместо циклического перебора Request.Files:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UploadFile(int uniqueID, HttpPostedFileBase file)
{
    return View();
}

и, если вы хотите опубликовать несколько файлов:

<div><input type="file" name="files" /></div>
<div><input type="file" name="files" /></div>
<div><input type="file" name="files" /></div>
...

, используйте коллекцию:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UploadFile(int uniqueID, IEnumerable<HttpPostedFileBase> files)
{
    return View();
}

Вы также можете найти следующий пост в блоге полезным.

Или, что еще лучше, использовать модель представления:

public class MyViewModel
{
    public int UniqueID { get; set; }
    public IEnumerable<HttpPostedFileBase> Files { get; set; }
}

, а затем:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UploadFile(MyViewModel model)
{
    return View();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...