2014-02-21 9 views
0

Я пытаюсь загрузить файл с помощью ASP.NET MVC 4. Я выполнял точно инструкции these, но когда я отправляю файл, я всегда ошибаюсь Индекс метод (хотя это делает форму). Мой код:Навигатор метода контроллера при загрузке файла в ASP MVC 4

Контроллер:

public class ActivationController : Controller 
{ 
    public ViewResult Index() 
    { 
     return View(new ActivationIndexViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(HttpPostedFileBase file) 
    { 
     // NEVER GET HERE! 
     if (file != null && file.ContentLength > 0) 
     { 
      var fileName = Path.GetFileName(file.FileName); 
      var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
      file.SaveAs(path); 
     } 
     return RedirectToAction("Index"); 
    } 
} 

Вид:

<form class="form-horizontal" role="form"> 
<div class="container-fluid"> 
    <div class="row"> 
     <div class="form-group"> 
      <label class="col-sm-2 control-label" for="file">Serial number</label> 
      <div class="col-sm-10"> 
       @using (Html.BeginForm("Index", "Activation", FormMethod.Post, new { enctype = "multipart/form-data" })) 
       { 
        <input type="file" name="file" /> 
        <input type="submit" value="Load" class="btn btn-primary" /> 
        <p class="help-block">Select a file</p> 
       } 
      </div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="form-group"> 
      <label class="col-sm-2 control-label">Продукт</label> 
      <div class="col-sm-10"> 
       @Html.DropDownListFor(m => m.SelectedProductId, 
        @Model.ActivatableProductsAsSelectList, new { @class = "form-control" }) 
       <p class="help-block">Select a product</p> 
      </div> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="form-group"> 
      <label class="col-sm-2 control-label">Options</label> 
      <div class="col-sm-10"> 
       <div class="table-responsive"> 
        <table class="table"/> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

RouteConfig:

routes.MapRoute(
      name: "Activation", 
      url: "{controller}/{action}", 
      defaults: new { controller = "Activation", action = "Index" } 
     ); 

Что я делаю неправильно?

+0

нет никаких проблем с вашим кодом. Я тестировал его, и он работает так, как ожидалось. Проверьте некоторые другие части кода. Или разделите связанный код, там мы можем проверить, где происходит загрузка файла. – ramiramilu

+0

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

+0

@ramiramilu Я также использую Bootstrap, может быть, это проблема? – Zharro

ответ

1

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

Простым решением является удаление внешней формы или замена внешней формы на внутреннюю форму. Другие варианты - использовать формы AJAX, но не вставлять их.

Иметь свой вид, как это -

@using (Html.BeginForm("Index", "Activation", FormMethod.Post, new { enctype = "multipart/form-data", id = "Form1" })) 
{ 
    <div class="container-fluid"> 
     <div class="row"> 
      <div class="form-group"> 
       <label class="col-sm-2 control-label" for="file">Serial number</label> 
       <div class="col-sm-10"> 

        <input type="file" name="file" /> 
        <input type="submit" value="Load" class="btn btn-primary" /> 
        <p class="help-block">Select a file</p> 

       </div> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="form-group"> 
       <label class="col-sm-2 control-label">Продукт</label> 
       <div class="col-sm-10"> 
        @Html.DropDownListFor(m => m.SelectedProductId, new SelectList(Model.ActivatableProductsAsSelectList, "Value", "Text"), "Select", new { @class = "form-control" }) 
        <p class="help-block">Select a product</p> 
       </div> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="form-group"> 
       <label class="col-sm-2 control-label">Options</label> 
       <div class="col-sm-10"> 
        <div class="table-responsive"> 
         <table class="table" /> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
} 

Тогда ваши действия контроллера -

[HttpPost] 
    public ActionResult Index(ActivationIndexViewModel model, HttpPostedFileBase file) 
    { 
     // NEVER GET HERE! 
     if (file != null && file.ContentLength > 0) 
     { 
      var fileName = Path.GetFileName(file.FileName); 
      var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
      file.SaveAs(path); 
     } 
     return RedirectToAction("Index"); 
    } 

выход будет -

enter image description here

+0

большое спасибо! – Zharro