.net C#代码未按预期工作,继续获取bool变量为false

vxbzzdmp  于 2023-01-06  发布在  .NET
关注(0)|答案(3)|浏览(135)

我正在尝试构建这个在线食品订购应用程序。当使用Postman在控制器中测试HttpPost方法时,我期望布尔值为true,但不断得到对应于它为false的消息。
这是我的Web服务模型。

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace OnlineFoodOrderWebService.Models
{
    public class Item
    {
        [Required]
        public int CategoryId { get; set; }
        [Required]
        public string ItemId { get; set; }
        [Required, StringLength(50, MinimumLength = 4)]
        public string ItemName { get; set; }
        [Required]
        public decimal Price { get; set; }
    }
}

这是我的DAL模型

using System;
using System.Collections.Generic;

#nullable disable

namespace OnlineFoodOrderDALCrossPlatform.Models
{
    public partial class Item
    {
        public Item()
        {
            Orders = new HashSet<Order>();
        }

        public string ItemId { get; set; }
        public string ItemName { get; set; }
        public int CategoryId { get; set; }
        public decimal Price { get; set; }

        public virtual Category Category { get; set; }
        public virtual ICollection<Order> Orders { get; set; }
    }
}

这是我仓库里的相应方法

public bool AddItem(Item newItem)
        {
            bool status = false;
            try
            {
                context.Items.Add(newItem);
                context.SaveChanges();
                status = true;
            }
            catch (Exception)
            {

                status=false;
            }
            return status;
        }

这是我的控制器类的方法。

[HttpPost]
        public JsonResult AddItem(Models.Item item)
        {
            bool status = false;
            string message;

            try
            {
                Item newItem = new Item
                {
                    CategoryId = item.CategoryId,
                    ItemId = item.ItemId,
                    ItemName = item.ItemName,
                    Price = item.Price,
                };

                status = repository.AddItem(newItem);
                if (status)
                {
                    message = "Successful add of new Item";
                }
                else
                {
                    message = "Failed to add new Item";
                }
            }
            catch (Exception)
            {

                message = "Something went wrong, try again.";
            }
            return Json(message);
        }

当我在 Postman 测试时,我应该会得到“成功添加新项目”,但一直得到“未能添加新项目”。我已经尝试了很多不同的事情,但没有运气。任何帮助都将是伟大的!
这是我张贴在 Postman 的方式

{
    "CategoryId": 1,
    "ItemId": "abc123",
    "ItemName": "My Item",
    "Price": 19.99
}

我得到的例外是
“SQL异常:表“OnlineFoodOrderDB.dbo. Items”的列“ItemId”中的字符串或二进制数据将被截断。截断的值:'123'”。

8zzbczxx

8zzbczxx1#

public bool AddItem(Item newItem)
    {
        bool status = false;
        try
        {
            context.Items.Add(newItem);
            context.SaveChanges();
            status = true;
        }
        catch (Exception)
        {
            // Log the Exception here
            status=false;
        }
        return status;
    }

您需要记录异常,而不是仅仅丢弃它并将status设置为false。
我猜你会在那里找到你的问题。

ilmyapht

ilmyapht2#

AddItem()抛出异常。如果您调试或显示抛出的异常,例如添加以下代码,将非常有帮助:

try{
    ...
}catch(Exception ex) {
    Console.WriteLine(ex);
}
guykilcj

guykilcj3#

根据您共享的异常消息,问题在于您为ItemId指定的值比您的模式支持的最大值长。
由于它被截断为123,因此可以安全地假设该类型最多支持3个字符。

context.Items.Add(newItem);

如果你想的话,你可以自己做截断,但是,如果你要存储“12345”,那么你最终会得到“123”。
或者,您可以验证您的值,例如

[StringLength(3, ErrorMessage = "ItemId cannot be longer than 3 characters")]

或者,您可以更改模式以更改数据库中ItemId的类型,从而允许它保存更长的值,例如:

ALTER TABLE yourtable VARCHAR(16);

无论您选择哪种解决方案,明智的做法是确保在trycatch块中正确处理Exception,将其记录在某个地方或以某种方式显示出来,以便下次遇到此类问题时,您可以更轻松地解决它。

相关问题