如何在保存到数据库表之前截断从 UI 控件获取的额外字符串字符
本文关键字:获取 控件 UI 字符 字符串 保存 数据库 | 更新日期: 2023-09-27 18:31:58
我有一个MVC应用程序,其中我从文本框控件接收一些数据作为电话号码。在数据库表中,我已将其列大小指定为 (varchar 50)。因此,如果我在数据库系统中插入超过 50 个字符,则会引发如下错误:一个或多个实体的验证失败。有关更多详细信息,请参阅"实体验证错误"属性。
因此,我想在自动将其保存到数据库之前截断所有多余的字符,而不会限制其在 UI 控件本身上的大小。
下面是尝试使用 EF 将其保存到数据库中时的代码:
private void PresetNewContacts(List<ContactModel> contacts)
{
contacts.ForEach(contact =>
{
if ((!string.IsNullOrEmpty(contact.CompanyName) || !string.IsNullOrEmpty(contact.ContactName)) && contact.TrnContact != null)
{
contact.PhoneNumber = contact.TrnContact.PhoneNumber;
contact.EmailAddress = contact.TrnContact.EmailAddress;
contact.NominatingEmployeeID = CargoSessionProvider.LoggedinUser.NominatingEmployeeID;
contact.Company = contact.Company == "[New]" ? contact.CompanyName : contact.Company;
//Save new contact in DB and update ContactID
contact.TrnContact.ContactID = NominationService.SaveContact(contact);
}
});
}
/// <summary>
/// Saves the changes in the context
/// </summary>
public void SaveChanges()
{
try
{
DbContext.SaveChanges();
}
catch (DbEntityValidationException ex)
{
throw ex;
}
catch (Exception ex)
{
throw;
}
}
由于您使用的是MVC
,另一种选择是在view model
上创建一个属性。 像这样:
[StringLength(50, ErrorMessage = "Phone Number can only be 50 characters.")]
public string PhoneNumber { get; set; }
如果键入的字符超过 50 个,这将对模型产生错误,您可以在客户端显示该错误。 如果您甚至不想让他们输入超过 50 个字符,则可以使用 maxlength
:
@Html.TextBoxFor(model => model.PhoneNumber, new {maxlength = 50})
想法 #1
步骤1)从相关表中的字段信息查询数据库。
步骤2)按系统类型,您可以获得每列的调整字段长度。
步骤3)编写一个函数,将返回的数据与尝试传递的数据 (c#) 匹配,并在 MVC 应用程序中限制/截断数据。
步骤4)将截断的数据写入 SQL 服务器。
想法#2(更安全)
将所有数据库写入发送到存储过程,该过程在将传输的数据保存到数据库之前对数据进行调节。 降低代码注入的风险,同时让您完全控制要写入的表固有的任何限制。
获取表上信息的示例代码:
select
c.name, c.system_type_id,c.max_length,c.precision,c.scale
from
sys.columns as c
inner join sys.tables as t on c.object_id = t.object_id
where
t.name = 'SomeTable'
一个简单的解决方案是向二传器添加截断
public string SomeString{
get;
set { // In here put truncation code - this should fire when coming back from the view };
}