2016-11-09 1 views
0

Как я могу использовать два контроллера действий в одной формеЗагрузить файл в форме, используя другой контроллер [HttpPost] ActionLink

Я не могу понять способ сделать два контроллера действий в BeginForm()

у меня есть этот взгляд на моем проекте:

@using (Html.BeginForm()){ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h4>T_Categorie</h4> 
    <hr /> 
    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
    <div class="form-group"> 
     @Html.LabelFor(model => model.CatName, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.CatName, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.CatName, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.CatDesc, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.CatDesc, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.CatDesc, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-10"> 
      <label class="control-label col-md-2">Upload an image</label> 
      <input type="file" name="image" runat="server" style="width: 100%;" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Create" class="btn btn-default" /> 
     </div> 
    </div> 
</div>} 

Вот моя Категория создания ActionLink Wich находится в T_CategorieController

 [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "CatName,CatDesc")] T_Categorie t_Categorie) 
    { 
     if (ModelState.IsValid) 
     { 

      db.T_Categorie.Add(t_Categorie); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(t_Categorie); 
    } 

Вот мой файл Uploader которым находится в T_Images контроллер

 [HttpPost] 
    public ActionResult FileUpload(HttpPostedFileBase image, T_Categorie CurrentCat) 
    { 
     if (image != null) 
     { 
      if (image.ContentLength > 0) 
      { 
       byte[] imageData = null; 
       using (var binaryReader = new BinaryReader(image.InputStream)) 
       { 
        imageData = binaryReader.ReadBytes(image.ContentLength); 
       } 

       try 
       { 
        //Upload to database 
        T_Images newImage = new T_Images { ImgData = imageData }; 
        db.T_Images.Add(newImage); 
        db.SaveChanges(); 
        //Change the currentCat fk_ImgId 
        var CurrentImageDB = db.T_Images.OrderByDescending(t => t.ImgId).First(); 
        var currentRefCat = db.T_Categorie.Find(CurrentCat.CatId); 
        // 
        currentRefCat.fk_ImgID = CurrentImageDB.ImgId; 
        db.SaveChanges(); 
       } 
       catch (System.Data.SqlClient.SqlException) 
       { 
        throw new FileLoadException(); 
       } 
      } 
     } 
     return RedirectToAction("Index", "Home"); 
    } 
+0

Итак, вы хотите, чтобы ваша форма вызывала Create, а затем вызывала FileUpload? если это так, вы не можете. Форма может иметь только один вариант. Измените свой контроллер, чтобы прочитать данные формы в действии загрузки файла. – Darren

+0

Могу ли я поместить несколько параметров для Create ActionLink, чтобы я мог ссылаться на свое изображение там? –

+0

добавьте скрытые поля в вашу форму и прочитайте их в своем действии. здесь это поможет http://stackoverflow.com/questions/5149116/mvc-how-to-post-file-upload-and-other-form-fields-to-one-action – Darren

ответ

0

мне нужно передать параметр в Html.BeginForm() Поскольку кнопки [HttpPost] Свяжите модель для моего создать ActionLink я просто ссылаться мой образ в BeginForm()

моя процедура вид BeginForm:

@using (Html.BeginForm("Create", "T_Categorie", FormMethod.Post, new { enctype = "multipart/form-data" })) 

My Controller перенаправляет мой CreateActionLink Порядку FileUpload

  [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(HttpPostedFileBase IMG, [Bind(Include = "CatName,CatDesc")] T_Categorie t_Categorie) 
    { 
     if (ModelState.IsValid) 
     { 
      db.T_Categorie.Add(t_Categorie); 
      db.SaveChanges(); 
      var addedCategory = db.T_Categorie.Find(t_Categorie.CatName); 
      return RedirectToAction("FileUpload", "T_Images", new { image = IMG, CurrentCat = addedCategory }); 
     } 

     return View(t_Categorie); 
    }