簡體   English   中英

在保存到數據庫表之前,如何截斷從UI控件獲取的多余字符串字符?

[英]How to truncate extra string characters get from UI control before saving to database table?

我有一個MVC應用程序,其中從文本框控件接收一些數據作為電話號碼。 在數據庫表中,我已將其列大小指定為(varchar 50)。 因此,如果我在數據庫系統中插入了50個以上的字符,則會引發如下錯誤:對一個或多個實體的驗證失敗。 有關更多詳細信息,請參見'EntityValidationErrors'屬性。

所以我想截斷所有多余的字符,然后將其自動保存到數據庫中,而又不限制它在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 Server。


想法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 }; 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM