2016-07-13 69 views
0

我們希望將從ASP.NET Web應用程序發送的電子郵件保存在數據庫中。這個想法是電子郵件的格式存儲在數據庫中。插入存儲在數據庫中的字符串

的問題是,電子郵件應該包括訂單的具體信息,例如:

謝謝您的訂單約翰·史密斯,

訂單1234已收到

我」什麼m試圖實現的是,我已經在數據庫列值中使用了字符串逐字符,它將以如下形式存儲:

謝謝您的訂單{} o.customer,

您的訂單{} o.id已收到

我很好奇,是否有可能做串插在哪裏值已經在格式化的字符串中。如果我嘗試使用String.Format(dbEmailString)它拋出我的異常:

型「System.FormatException」的異常出現在mscorlib.dll 但在用戶代碼中沒有處理

其他信息:輸入字符串的不以正確的格式。

+0

哪裏碼? – sstan

回答

4

字符串插值是一個編譯時間功能。你可以做你想要使用的是什麼正規String.Format

var formattedEmail = String.Format("Thank you for your order {0}, your order {1} has been received", o.customer, o.id); 

如果你有一個要求與值替換出各種不同的佔位符,也許你需要尋找一個更有活力的模板系統,非常基本可以用String.Replace完成。

底線是你不能直接從存儲的字符串中以這種方式引用代碼中的變量 - 你需要在運行時以某種方式處理字符串。

+0

我認爲這回答了我很快提出的問題。如果佔位符的數量可能不同,我所需要的將會過於動態。我想我應該嘗試以不同的方式繞過它,可能與String.Replace – johnnyCasual

+0

@johnnyCasual如果你走這條路線,你當然可以保持你已經有的完全相同的佔位符,並簡單地將它們替換掉,例如:'email = email.Replace(「{o.customer}」,o.customer)' - 這樣你可以保持名稱與變量相同,如果你願意的話。 –

-1

我想你指的C#6.0中的新功能:https://msdn.microsoft.com/en-us/library/dn961160.aspx

我只瞭解它並沒有經驗呢。但它必須與customerid變量一起工作,並且我沒有符號可以使用或不使用對象的屬性。

string customer = o.customer; int id = o.id; string msg = $"Thank you for your order {customer},your order {id} has been received";

給你正確的結果。 (VS 2015和.Net 4.6提供。)

string msg = $"Thank you for your order {o.customer}, your order {o.id} has been received";` 

它可能工作,我沒有線索。

+0

是的,我試圖實現,但問題是,我不能使用字符串msg = $ dbEmailString。它不允許$前綴字符串變量 – johnnyCasual

+0

我錯過了這句話:「這個想法是電子郵件的格式存儲在數據庫中。」插入的字符串是一個編譯時間功能,所以在這種情況下它不可用。 –

0

在c#6中,內插字符串表達式看起來像一個包含表達式的模板字符串。 它看起來像是String.Format()佔位符,但它不是索引,而是大括號內的表達式本身。
它看起來像C#6中的String.Format()是編譯器在後臺對待像String.Format()那樣的語法糖。

例如,要在VS 2015顯示OP表達式:

class Program 
{ 
    static void Main(string[] args) 
    { 

     dynamic order = new {customer = "Robert", id=123}; 
     PrintString(order);    
    } 


    static void PrintString(dynamic o) 
    { 
     var exp1 = $"Thank you for your order { o.customer}"; 
     var exp2 = $"your order { o.id} has been received"; 
     Console.WriteLine(exp1); 
     Console.WriteLine(exp2); 

    } 

} 

輸出是:

謝謝您的訂單羅伯特

您的定單123已收到

您可以從數據庫中檢索格式化的表達式,並在前面加上「$」作爲前綴,如上例所述。

在VS 2013,您可以安裝新的編譯器到項目作爲NuGet包: 安裝,包裝Microsoft.Net.Compilers

+0

爲什麼-1,如果我的答案通過工作示例解決OP的內容。 –

+0

_「您可以從數據庫中檢索格式化的表達式,並將其前綴爲」$「,如上例所述。」_否,您不能。靜態編譯時間字符串[很好](http://i.stack.imgur.com/0Wnq6.png)插值,來自數據庫的動態字符串[不會工作](http://i.stack.imgur.com /c6ykG.png) –

相關問題