Search code examples
c#asp.net-mvcfile-uploadhtml.beginform

Upload a file within a form using another Controller [HttpPost] ActionLink


How can I use my two controller Action in one form?

I can't figure a way to do two controller Action in the BeginForm().

I have this view on my project:

@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>}

Here's my Category Create ActionLink which is in the 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);
    }

Here's my file Uploader which is in the T_Images Controller

        [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");
    }

Solution

  • I needed to pass a parameter to the Html.BeginForm() Since the [HttpPost] Bind a model to my create ActionLink I just have to reference my image in the BeginForm()

    my view BeginForm procedure:

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

    My Controller is redirecting my CreateActionLink to the FileUpload Procedure

                [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);
        }