Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery Dropdownlist选择保存id而不是名称_Jquery_Asp.net_Asp.net Mvc - Fatal编程技术网

Jquery Dropdownlist选择保存id而不是名称

Jquery Dropdownlist选择保存id而不是名称,jquery,asp.net,asp.net-mvc,Jquery,Asp.net,Asp.net Mvc,我不熟悉MVC和jQuery。以下问题涉及两个表,Product和QuoteDetail。我使用DropDownListFor允许用户根据名称从产品表中选择产品。选择名称后,QuoteDetail记录中的两个文本框将分别填充ProductId和价格。一切都很好。我的问题是,当我保存QuoteDetail记录时,它将ProductId保存在ProductName字段中,而不是ProductName。我不知道如何避免在SelectList中使用ProductId,因为我需要它来执行查找。我如何绕过此

我不熟悉MVC和jQuery。以下问题涉及两个表,Product和QuoteDetail。我使用DropDownListFor允许用户根据名称从产品表中选择产品。选择名称后,QuoteDetail记录中的两个文本框将分别填充ProductId和价格。一切都很好。我的问题是,当我保存QuoteDetail记录时,它将ProductId保存在ProductName字段中,而不是ProductName。我不知道如何避免在SelectList中使用ProductId,因为我需要它来执行查找。我如何绕过此问题并保存产品名称

以下是DropDownListFor的读取方式:

 @Html.DropDownListFor(model => model.ProductName, new SelectList(ViewBag.ProductData, "ProductId", "Name"), new { htmlAttributes = new { @id = "ProductName", @class = "ProductList" } });
查找的jQuery如下所示:

<script type="text/javascript">
            $(document).ready(function () {
                $(document).on("change", '[id*="ProductName"]', function () {
                    $.post("/QuoteViewModel/GetProduct", { pId: $(this).val() }, function (data) {
                        $("[id*='ProductId']").val(data.ProductId);
                        $("[id*='Price']").val(data.Price);
                    });
                });
              });
            </script>
[HttpPost]
        public ActionResult GetProduct(int pId)
        {
            var data = db.Products.Find(pId);
            return Json(data);
        }
[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(QuoteViewModel qvm,[Bind(Include = "CustomerId,SalesRep,FirstName,LastName,Company,Address1,Address2,City,State,PostalCode,WorkPhone,CellPhone,Email,Discount,PaymentTerms")] Customer customer,
                                 [Bind(Include = "QuoteId,QuoteDetailId,ProductId,ProductName,Amount,ListPrice,Discount,Price")] List<QuoteDetail> quoteDetails,
                                 [Bind(Include = "QuoteId,CustomerId,Subtotal,Tax,Total,QuoteDate,GoodUntil,QuoteSent,DateApproved,DateOrdered")] Quote quote)

        {

            if (ModelState.IsValid)
            {

                foreach (var quoteDetail in qvm.QuoteDetail)
                {

                    QuoteDetail qd = db.QuoteDetails.FirstOrDefault(o => ((o.QuoteId == quoteDetail.QuoteId) && (o.QuoteDetailId == quoteDetail.QuoteDetailId)));

                    if (qd != null)
                    {
                        qd.ProductId = quoteDetail.ProductId;
                        qd.ProductName = quoteDetail.ProductName;
                        qd.Amount = quoteDetail.Amount;
                        qd.ListPrice = quoteDetail.ListPrice;
                        qd.Discount = quoteDetail.Discount;
                        qd.Price = quoteDetail.Price;
                    }
                    else
                    {
                        db.QuoteDetails.Add(quoteDetail);
                    }

                }

                quote.QuoteId = qvm.QuoteId;
                quote.GoodUntil = qvm.GoodUntil;
                quote.Discount = qvm.Discount;
                quote.DateApproved = qvm.DateApproved;
                quote.DateOrdered = qvm.DateOrdered;
                quote.Discount = qvm.Discount;
                quote.QuoteDate = qvm.QuoteDate;
                quote.QuoteSent = qvm.QuoteSent;
                quote.Subtotal = qvm.Subtotal;
                quote.Tax = qvm.Tax;
                quote.Total = qvm.Total;

                customer.CustomerId = qvm.CustomerId;
                customer.Address1 = qvm.Address1;
                customer.Address2 = qvm.Address2;
                customer.CellPhone = qvm.CellPhone;
                customer.City = qvm.City;
                customer.Company = qvm.Company;
                customer.Discount = qvm.Discount;
                customer.Email = qvm.Email;
                customer.FirstName = qvm.FirstName;
                customer.LastName = qvm.LastName;
                customer.PaymentTerms = qvm.PaymentTerms;
                customer.PostalCode = qvm.PostalCode;
                customer.SalesRep = qvm.SalesRep;
                customer.State = qvm.State;
                customer.WorkPhone = qvm.WorkPhone;

                db.Entry(quote).State = EntityState.Modified;
                db.Entry(customer).State = EntityState.Modified;

                bool saveFailed;
                do
                {
                    saveFailed = false;
                    try
                    {
                        db.SaveChanges();
                    }
                    catch (DbUpdateConcurrencyException ex)
                    {
                        saveFailed = true;
                        var objContext = ((IObjectContextAdapter)db).ObjectContext;
                        // Get failed entry
                        var entry = ex.Entries.Single();
                        // Now call refresh on ObjectContext
                        objContext.Refresh(RefreshMode.ClientWins, entry.Entity);


                    }

                } while (saveFailed);

                return RedirectToAction("Index");
            }
            return View(qvm);
        }
    }
}
请注意,产品名称在product表中称为“name”,在QuoteDetail表中称为“ProductName”。任何帮助都将不胜感激

用于保存的代码如下所示:

<script type="text/javascript">
            $(document).ready(function () {
                $(document).on("change", '[id*="ProductName"]', function () {
                    $.post("/QuoteViewModel/GetProduct", { pId: $(this).val() }, function (data) {
                        $("[id*='ProductId']").val(data.ProductId);
                        $("[id*='Price']").val(data.Price);
                    });
                });
              });
            </script>
[HttpPost]
        public ActionResult GetProduct(int pId)
        {
            var data = db.Products.Find(pId);
            return Json(data);
        }
[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(QuoteViewModel qvm,[Bind(Include = "CustomerId,SalesRep,FirstName,LastName,Company,Address1,Address2,City,State,PostalCode,WorkPhone,CellPhone,Email,Discount,PaymentTerms")] Customer customer,
                                 [Bind(Include = "QuoteId,QuoteDetailId,ProductId,ProductName,Amount,ListPrice,Discount,Price")] List<QuoteDetail> quoteDetails,
                                 [Bind(Include = "QuoteId,CustomerId,Subtotal,Tax,Total,QuoteDate,GoodUntil,QuoteSent,DateApproved,DateOrdered")] Quote quote)

        {

            if (ModelState.IsValid)
            {

                foreach (var quoteDetail in qvm.QuoteDetail)
                {

                    QuoteDetail qd = db.QuoteDetails.FirstOrDefault(o => ((o.QuoteId == quoteDetail.QuoteId) && (o.QuoteDetailId == quoteDetail.QuoteDetailId)));

                    if (qd != null)
                    {
                        qd.ProductId = quoteDetail.ProductId;
                        qd.ProductName = quoteDetail.ProductName;
                        qd.Amount = quoteDetail.Amount;
                        qd.ListPrice = quoteDetail.ListPrice;
                        qd.Discount = quoteDetail.Discount;
                        qd.Price = quoteDetail.Price;
                    }
                    else
                    {
                        db.QuoteDetails.Add(quoteDetail);
                    }

                }

                quote.QuoteId = qvm.QuoteId;
                quote.GoodUntil = qvm.GoodUntil;
                quote.Discount = qvm.Discount;
                quote.DateApproved = qvm.DateApproved;
                quote.DateOrdered = qvm.DateOrdered;
                quote.Discount = qvm.Discount;
                quote.QuoteDate = qvm.QuoteDate;
                quote.QuoteSent = qvm.QuoteSent;
                quote.Subtotal = qvm.Subtotal;
                quote.Tax = qvm.Tax;
                quote.Total = qvm.Total;

                customer.CustomerId = qvm.CustomerId;
                customer.Address1 = qvm.Address1;
                customer.Address2 = qvm.Address2;
                customer.CellPhone = qvm.CellPhone;
                customer.City = qvm.City;
                customer.Company = qvm.Company;
                customer.Discount = qvm.Discount;
                customer.Email = qvm.Email;
                customer.FirstName = qvm.FirstName;
                customer.LastName = qvm.LastName;
                customer.PaymentTerms = qvm.PaymentTerms;
                customer.PostalCode = qvm.PostalCode;
                customer.SalesRep = qvm.SalesRep;
                customer.State = qvm.State;
                customer.WorkPhone = qvm.WorkPhone;

                db.Entry(quote).State = EntityState.Modified;
                db.Entry(customer).State = EntityState.Modified;

                bool saveFailed;
                do
                {
                    saveFailed = false;
                    try
                    {
                        db.SaveChanges();
                    }
                    catch (DbUpdateConcurrencyException ex)
                    {
                        saveFailed = true;
                        var objContext = ((IObjectContextAdapter)db).ObjectContext;
                        // Get failed entry
                        var entry = ex.Entries.Single();
                        // Now call refresh on ObjectContext
                        objContext.Refresh(RefreshMode.ClientWins, entry.Entity);


                    }

                } while (saveFailed);

                return RedirectToAction("Index");
            }
            return View(qvm);
        }
    }
}

这是因为当您提交表单时,所有相应表单元素中的值都映射到包含它们的元素的
name
属性,而不是
id
属性

您需要确保在元素上按预期显式设置
name
属性,以确保它们绑定了正确的值:

<!-- If you wanted the value from this bound as "ProductId", you would need to set the
     name attribute in the htmlAttributes object -->
@Html.DropDownListFor(model => model.ProductName, ..., new { ...  name="ProductId" } });
以及:

$(document).on("change", '[id*="ProductId"]', function () {
     $.post("/QuoteViewModel/GetProduct", { pId: $(this).val() }, function (data) {
         $("[id*='ProductId']").val(data.ProductId);
         // This could be a hidden element within your form
         $("[id*='ProductName']").val(data.ProductName);
         $("[id*='Price']").val(data.Price);
     });
});

请提供一段用于保存的代码。有关保存代码,请参见上文。我尝试了您提出的第一个解决方案,但我可能做得不对。请参见上面我发布代码的地方。第二个解决方案,允许它直接绑定到ProductId,破坏了查找。我认为您告诉了我正确的事情,但我一定没有正确地实现它们。这是我的一个输入错误,因为您的事件处理程序应该在
ProductId
元素上侦听内容,我已经对其进行了更新。基本上,您的ProductId下拉列表将处理两件事:存储选定的产品Id(稍后将发布到服务器)并使用该Id进行AJAX调用,该调用可以填充其他字段。但是,为了实际拥有该名称,您需要创建另一个隐藏的输入字段,以便在将其发布到服务器时可以访问它(可以是
,或者更简洁地说
@Html.HiddenFor)(m=>m.ProductName)
)。