2016-07-13 37 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) –

相关问题