【发布时间】:2021-05-02 05:14:10
【问题描述】:
我的发票类有一个StringBuilder 属性,因此如果进行了调整,用户会添加注释作为调整原因的详细信息。此属性在创建时设置为新的空 StringBuilder。只有在编辑模式下才会添加.Append()。据我了解,这比每次添加新注释时都使用adjustmentNotes += newAdjustmentNotes 更有效。
我的 Invoice.cs 类如下。
public class Invoice
{
[Key]
public int InvoiceID { get; set; }
[ForeignKey(nameof(Customer))]
public int CustomerID { get; set; }
public virtual Customer Customer { get; set; }
public virtual ICollection<Job> Jobs { get; set; }
public double InvoiceAmount { get; set; }
public StringBuilder AdjustmentNotes { get; set; }
public bool Paid { get; set; }
}
当填充我的列表或详细信息视图时,我查询数据库如下:
using (var ctx = new ApplicationDbContext())
{
var query = ctx.Invoices
.Where(e => e.InvoiceID >= 0)
.Select(e => new InvoiceListItem
{
InvoiceID = e.InvoiceID,
CustomerID = e.CustomerID,
InvoiceAmount = e.InvoiceAmount,
Paid = e.Paid,
AdjustmentNotes = e.AdjustmentNotes.ToString()
});
return query.ToArray();
}
然后我收到以下错误消息。
System.NotSupportedException: 'StringBuilder' 类型的值无法转换为字符串。'
但根据 Microsoft 文档、此论坛上的其他问题以及各种资源,这是完成此任务的正确方法。
我当然可以将它改回字符串并根据需要使用 +=。这个特定属性不会有太多注释,但是有人可以解释我做错了什么吗?非常感谢!
编辑:为澄清起见,这是我的InvoiceListItem 模型类:
public class InvoiceListItem
{
public int InvoiceID { get; set; }
public int CustomerID { get; set; }
public List<int> JobIDs { get; set; }
public double InvoiceAmount { get; set; }
[UIHint("Bool")]
public bool Paid { get; set; }
public string AdjustmentNotes { get; set; }
}
【问题讨论】:
-
一般来说,您不需要在模型中使用 stringbuilder,而是需要字符串,只需根据需要使用 stringbuilder 来构建您的字符串。它更像是一个临时类,可以帮助您有效地处理字符串。但从根本上说,它只会产生一个字符串
-
如果删除 `AdjustmentNotes = e.AdjustmentNotes.ToString()` 行会发生什么?还会扔吗?
-
@Jawad 我的 AdjustmentNotes 的 InvoiceListItem 模型是一个字符串。我不认为它也应该是一个 stringBuilder 因为我只想显示这个视图的消息。我不会添加任何东西。即使在我的编辑中,我也会输入一个字符串并执行:AdjustmentNotes.AppendLine(model.AdjustmentNotes);
-
@ekke。我可以删除该行并且我没有收到错误。但是,我将如何显示该信息?我是不是应该绕个弯,直接从数据库中抓取,扔到ViewBag里??
-
我认为这不是使用 StringBuilder 的合适方式。我希望能够轻松地将新的注释行添加到以前的注释中。我决定只为便笺创建一个新类,并且发票可以将便笺列表作为属性。笔记类将由主题、日期和内容组成。谢谢大家
标签: c# asp.net-mvc entity-framework linq razor