【问题标题】:MVC save button is failing to add data to DBMVC 保存按钮无法将数据添加到数据库
【发布时间】:2021-05-26 15:11:56
【问题描述】:

我一直在研究 MVC 购物车,试图将数据从视图页面存储到数据库。但是保存按钮无法像我希望的那样工作,它返回错误警报而不是成功警报。

这是视图模型



    public class ItemViewModel
    {
        public Guid ItemId { get; set; }
        public int CategoryId { get; set; }
        public string ItemCode { get; set; }
        public string ItemName { get; set; }
        public string Description { get; set; }
        public decimal ItemPrice { get; set; }
        public HttpPostedFile ImagePath { get; set; }
        public IEnumerable CategorySelectListItem { get; set; }
    }
    
    

这是控制器


private ECartDBEntities objECartDbEntities;
    public ItemController()
    {
        objECartDbEntities = new ECartDBEntities();
    }
    // GET: Item
    public ActionResult Index()
    {
        ItemViewModel objItemViewModel = new ItemViewModel();
        objItemViewModel.CategorySelectListItem = (from objCat in objECartDbEntities.Categories
                                                   select new SelectListItem()
                                                   {
                                                       Text = objCat.CategoryName,
                                                       Value = objCat.CategoryId.ToString(),
                                                       Selected = true
                                                   });
        return View(objItemViewModel);
    }

    [HttpPost]
    public JsonResult Index(ItemViewModel objItemViewModel)
    {
        string NewImage = Guid.NewGuid() + Path.GetExtension(objItemViewModel.ImagePath.FileName);
        objItemViewModel.ImagePath.SaveAs(filename: Server.MapPath("~/Images/" + NewImage));

        Item objItem = new Item();
        objItem.ImagePath = "~/Images/" + NewImage;
        objItem.CategoryId = objItemViewModel.CategoryId;
        objItem.Description = objItemViewModel.Description;
        objItem.ItemCode = objItemViewModel.ItemCode;
        objItem.ItemId = Guid.NewGuid();
        objItem.ItemName = objItemViewModel.ItemName;
        objItem.ItemPrice = objItemViewModel.ItemPrice;
        objECartDbEntities.Items.Add(objItem);
        objECartDbEntities.SaveChanges();

        return Json(data: new { Success = true, Message = "Item is added successfully." }, JsonRequestBehavior.AllowGet);
    }

这是查看页面



        
        $(document).ready(function () {
            $("#btnSave").click(function () {
                SaveItem();
            });
        });
    
        function ResetItem() {
            $("#CategoryId").val("");
            $("#ItemCode").val("");
            $("#ItemName").val("");
            $("#Description").val("");
            $("#ItemPrice").val("");
            $("#ImagePath").val("");
        }
    
        function SaveItem() {
            var formData = new FormData;
            formData.append("CategoryId", $("#CategoryId").val());
            formData.append("ItemCode", $("#ItemCode").val());
            formData.append("ItemName", $("#ItemName").val());
            formData.append("Description", $("#Description").val());
            formData.append("ItemPrice", $("#ItemPrice").val());
            formData.append("ImagePath", $("#ImagePath").get(0).files[0]);
    
    
            $.ajax({
                async: true,
                dataType: 'JSON',
                type: 'POST',
                contentType: false,
                processData: false,
                url: '/Item/Index',
                data: formData,
                success: function (data) {
                    if (data.Success) {
                        alert(data.Message);
                        ResetItem();
                    }
                },
                error: function () {
                    alert("There is a problem with adding item.");
                }
            });
        }
    
<div>
<div class="col-md-4">
    <div class="form-group">
        Category :
        @Html.DropDownListFor(model => model.CategoryId, new SelectList(Model.CategorySelectListItem, dataValueField: "Value", dataTextField:"Text"),
       htmlAttributes: new { @class = "form-control"})
    </div>
</div>

<div class="col-md-4">
    <div class="form-group">
        Item Code :
        @Html.TextBoxFor(model => model.ItemCode, htmlAttributes: new { @class = "form-control", autocomplete = "Off"})
    </div>
</div>

<div class="col-md-4">
    <div class="form-group">
        Item Name :
        @Html.TextBoxFor(model => model.ItemName, htmlAttributes: new { @class = "form-control", autocomplete = "Off" })
    </div>
</div>

<div class="col-md-4">
    <div class="form-group">
        Description :
        @Html.TextBoxFor(model => model.Description, htmlAttributes: new { @class = "form-control", autocomplete = "Off" })
    </div>
</div>


<div class="col-md-4">
    <div class="form-group">
        Item Price :
        @Html.TextBoxFor(model => model.ItemPrice, htmlAttributes: new { @class = "form-control", autocomplete = "Off" })
    </div>
</div>

<div class="col-md-4">
    <div class="form-group">
        Image :
        @Html.TextBoxFor(model => model.ImagePath, htmlAttributes: new { type = "file", @class = "form-control" })
    </div>
</div>

    <div>
        <input type="button" value="Save" name="save" class="btn btn-primary" id="btnSave"/>
        &nbsp;
        <input type="button" value="Reset" name="reset" class="btn btn-danger" /> 
    </div>

</div>

当我点击 save 按钮时,它应该返回成功警报消息“项目添加成功”,但我得到的只是错误警报“添加项目有问题” .

【问题讨论】:

  • 首先:添加错误参数,这样您就可以看到错误是什么error: function(jqXHR, textStatus, errorThrown) { console.log(textStatus, errorThrown) }。第二:调试你的 POST 动作,看看它在做什么(以前的错误信息可能在这里)。
  • 下一步:尝试使用 much 更简单的内容的帖子,例如只是一个字符串(在操作参数中) - 一旦可行,更改为 int? 然后是 @987654328 @ then 更改为 simple 类(只有一个字符串),然后逐个添加其他字段。这是猜测错误在模型绑定中。它可以很容易地出现在 .Items.Add.Save 中(例如,在数据库中缺少必需的列) - 所以将这两行注释掉以开始(errorThrown 应该有帮助)
  • 您是否通过在控制器操作上设置断点来检查您是否正在获取数据?

标签: c# jquery asp.net asp.net-mvc asp.net-ajax


【解决方案1】:

请检查以下步骤:

  1. 为您的表单提供 id (.cshtml)。

    @using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post, new { @id = "formId", @enctype = "multipart/form-data" }))

    {

    //enctype is given above as you have mentioned about Image files
    
    //Your UI elements here
    

    }

  1. Ajax 请求

//试试下面:

 var formData = new FormData($('#formId').get(0));

现在通过调试检查数据是否传递给控制器​​方法(objItemViewModel)的对象。

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 2018-10-10
    • 2017-10-27
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多