ASP. NET Средство загрузки изображений MVC5 создает проблему при отправке формы с использованием Ajax и jQuery - PullRequest
0 голосов
/ 10 июля 2020

Когда я нажимаю кнопку «Создать», каждый раз, когда выделяется кнопка просмотра или загрузчик изображений. У меня нет кода проверки для этого элемента html, и я не понимаю, почему это происходит.

Я использую jQuery и Ajax для публикации этой формы. Я использую ASP. NET MVC5 Это мой класс модели

public partial class tbl_products
{
    public int prod_id { get; set; }
    [Required]
    public string prod_name { get; set; }
    public string prod_image_path { get; set; }
    [NotMapped]
    public HttpPostedFileBase ImageUpload { get; set; } // this is to upload images on project folder
    public tbl_products()
    {
        prod_image_path = "~/Content/Images/choose_image.png";
    }
}

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

public class ProductController : Controller
{
    DemoDbEntities db = new DemoDbEntities();
    // GET: Employee
    public ActionResult Index()
    {
        return View();
    }
    public ActionResult ViewAllProducts()
    {
        return View(GetAllProducts());
    }
    IEnumerable<tbl_products> GetAllProducts()
    {
        return db.tbl_products.ToList<tbl_products>();
    }
    public ActionResult AddorEdit(int id = 0)
    {
        //create new object of prodocts to pass it to view
        tbl_products prodObj = new tbl_products();//image path set to default image
        return View(prodObj);
    }
    [HttpPost]
    public ActionResult AddorEdit(tbl_products prodObj)
    {
        //check if the input type=file has image
        if(prodObj.ImageUpload != null)
        {
            string fName = Path.GetFileNameWithoutExtension(prodObj.ImageUpload.FileName);
            string fExten = Path.GetExtension(prodObj.ImageUpload.FileName);
            fName = fName + DateTime.Now.ToString("yymmssfff") + fExten;
            prodObj.prod_image_path= "~/Content/Images/" + fName;
            //fName = Path.Combine(Server.MapPath("~/Content/Images/"), fName);
            prodObj.ImageUpload.SaveAs(Path.Combine(Server.MapPath("~/Content/Images/"), fName));
        }
       
        db.tbl_products.Add(prodObj);
        db.SaveChanges();
        return RedirectToAction("ViewAllProducts");
    }
}

Ниже вид

image Ajax и jQuery // метод для передачи данных формы в контроллер с помощью ajax функции jQueryAjaxPost (form) {

//$.validator.unobtrusive.parse(form);//to validate form validation
if ($(form).valid())
{
    var ajaxConfig = { // this is a complete objecct
        type: 'POST',
        url: form.action,
        data: new FormData(form),
        success: function (response) {
            $('#viewAllTab').html(response);
        }
    }
    //check if the form has file uploader
    //then set these two attributes to false
    if ($(form).attr('enctype') == "multipart/form-data")
    {
        ajaxConfig["contentType"] = false;
        ajaxConfig["processData"] = false;
    }
    $.ajax(ajaxConfig); // passing object to ajax function
}
else
{
    return false;
}

}

Я не могу создать продукт с помощью метода ajax post.

1 Ответ

0 голосов
/ 10 июля 2020

Как я вижу в вашем коде, в вашем представлении вы используете @Html.AntiForgeryToken()

Если вы хотите использовать это, вам также следует использовать его в своем контроллере или вы удалите это из своего представления:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult AddorEdit(tbl_products prodObj) {
        //check if the input type=file has image
        if (prodObj.ImageUpload != null) {
            string fName = Path.GetFileNameWithoutExtension(prodObj.ImageUpload.FileName);
            string fExten = Path.GetExtension(prodObj.ImageUpload.FileName);
            fName = fName + DateTime.Now.ToString("yymmssfff") + fExten;
            prodObj.prod_image_path = "~/Content/Images/" + fName;
            //fName = Path.Combine(Server.MapPath("~/Content/Images/"), fName);
            prodObj.ImageUpload.SaveAs(Path.Combine(Server.MapPath("~/Content/Images/"), fName));
        }
    
        db.tbl_products.Add(prodObj);
        db.SaveChanges();
        return RedirectToAction("ViewAllProducts");
      }
    }

Когда вы отправляете форму, вы отправляете данные в свой метод контроллера. Если у метода есть атрибут ValidateAntiForgeryToken, он проверяет, есть ли у отправляемых вами данных ваш ForgeryToken.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...