을하는 동안 변수에 문자를 무시하는 방법은 예를 다음에 사용자 추가 텍스트가 포함 된 실패에 대한 이유라는 문자열 변수가 }} (82) 키트는, 및 String.format
이제이 변수는 string.format을 사용하는 메소드의 일부입니다. 위 변수의 텍스트에서 {0} {1}과 혼동하지 않도록 string.format이 필요합니다. 예외가 발생했습니다. 입력 문자열의 형식이 올바르지 않습니다.
을하는 동안 변수에 문자를 무시하는 방법은 예를 다음에 사용자 추가 텍스트가 포함 된 실패에 대한 이유라는 문자열 변수가 }} (82) 키트는, 및 String.format
이제이 변수는 string.format을 사용하는 메소드의 일부입니다. 위 변수의 텍스트에서 {0} {1}과 혼동하지 않도록 string.format이 필요합니다. 예외가 발생했습니다. 입력 문자열의 형식이 올바르지 않습니다.
문제는 변수 serviceEntry.ReasonForFailure
가 format item이 포함되어 있다는 것입니다. 형식 항목으로 취급하지 않으려면 여분의 중괄호를 사용하여 이스케이프 처리해야합니다. 예를 들어, {0}
은 here으로 설명한 {{0}}
이됩니다.
문제에 신속하고 더러운 솔루션은 이중 중괄호 모든 개폐 괄호를 대체하는 것입니다 :
"Reason For Failure:" + serviceEntry.ReasonForFailure.Replace("{","{{").Replace("}","}}") + "<br/>"
더 나은 솔루션은 정규 표현식을 사용하여 교체 할 것 :
을public string EscapeCurlyBraces(string value)
{
string strRegex = @"(\{\d+\})";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strReplace = @"{$1}";
return myRegex.Replace(value, strReplace);
}
그리고는 다음과 같이 사용 :
"Reason For Failure:" + EscapeCurlyBraces(serviceEntry.ReasonForFailure) + "<br/>"
업데이트 나는 현재 솔루션을 도랑 사용하여 다시 제안 StringBuilder
:
var emailBody = new StringBuilder();
emailBody.Append("<html><body>RSLMS - Service Request is complete<br/>");
emailBody.Append("Service Request initiated by you is Complete <br/>");
emailBody.AppendFormat("Please use the following link to access Run Log Entry <a href=\"{0}{1}\">{0}{1}</a><br/>", RunLogURL, runLogID);
// ommited some lines
emailBody.AppendFormat("Service ID: {0}<br/><br/>", serviceEntry.ID.ToString());
// ommited some lines
emailBody.AppendFormat("Reason For Failure: {0}<br/><br/>", serviceEntry.ReasonForFailure);
emailBody.Append("Thank you <br/> RSLMS Administrator <br/></body></html>");
message.Body = emailBody.ToString();
글쎄 그 사용자가 텍스트를 추가했기 때문에 항상 그 캐릭터를 추가하거나 다른 새로운 캐릭터를 추가 할 것이라고 확신하지는 못했습니다. :) 난 그 변수를 추가하는 그들을 막을 수있는 텍스트 상자에 몇 가지 자바 스크립트를 적용 할 수 있지만 나는이 값을 데이터베이스 열에 저장하는 데 문제가 없습니다. 문제는 내가 이메일을 작성하는 방식에서만 발생합니다. 나는 당신의 해결책을 시험하고 있습니다, 도움이 될 것 같습니다 –
이 새로운 정보를 주면 당신의 해결책은 결함이 있습니다. HTML 메일에 사용자 생성 텍스트를 삽입하려면 해당 문자열을 HTML로 인코딩해야합니다. 그리고 SQL 삽입으로부터 데이터베이스를 보호하기를 바랍니다. – venerik
메시지 본문을 포맷하기 전에 문자열을 인코딩해야합니까? 나는 그것을 시도하고 여전히 같은 오류] –
두 개의 String.Format이 있으므로 제공하지 못했습니다. 외부 변수에 대한 매개 변수, 외부 형식에 대해 x 및 y라고 가정합니다. 필요한 작업입니다. 당신은 당신 같이 내부 형식에서 탈출하려는 사람들을 위해 이중 중괄호를 할 필요가 : 당신이 예외를 받고있어
var reasonForFailure = "({{0}}) on arm ({{1}}) (82) Kits should still have 50 tests left after run, but it seems like the instrument is not able to pipette anymore from the kits.";
var message = string.Format(string.Format(
"<html><body>Request is complete<br/>" +
"Service Request initiated by you is Complete" + " <br/> " +
"Please use the following link to access <a href=\"{0}{1}\">{0}{1}</a> <br/>" +
"Reason For Failure: " + reasonForFailure+"<br/>" +
"</body></html>", RunLogURL, runLogID),x,y);
이유, The input string is not in the correct format
는 문자열을 구성하고있는 방식 때문이다. 변수에는 두 개의 닫는 중괄호가 있습니다. 여기서 string.Format은 하나만 예상됩니다 : on arm ({1}}
. 아래의 첫 번째 예와 같이이 변수를 String.Format의 매개 변수로 추가하면이 문제가 해결됩니다.
그렇지 않으면, 당신은 변수 serviceEntry.ReasonForFailure
이 {0}
및 {1}
이, 그리고 당신은 String.Format
내에서이 변수를 배치 할 때, 그 문자가 String.Format
인수로 대체되고 있음을, 다음이 적어도 설계된 문자를 포함 말하는 경우 당신이 당신의 문자열을 만드는 방식.
+
연산자를 사용하여 문자열에 변수를 삽입하는 대신 String.Format
호출에 다른 매개 변수로 포함하십시오. 이렇게하면 변수에 {0}
이 보존됩니다.
message.Body = string.Format(
"<html><body>Request is complete<br/>" +
"Service Request initiated by you is Complete<br/>" +
"Please use the following link to access " +
"<a href=\"{0}{1}\">{0}{1}</a><br/>" +
"Reason For Failure: {2}<br/></body></html>",
RunLogURL, runLogID, serviceEntry.ReasonForFailure);
지금, 당신은 다른 값으로 serviceEntry.ReasonForFailure
에 {0}
및 {1}
를 교체하려는 경우, 중첩 할 수 다른 내부 및 String.format :
serviceEntry.ReasonForFailure = "10003 Insufficient Liquid Level detected at " +
"pipettor channel ({0}) on arm ({1}) (82)";
var channelId = 87;
var armId = 42;
message.Body = string.Format(
"<html><body>Request is complete<br/>" +
"Service Request initiated by you is Complete<br/>" +
"Please use the following link to access " +
"<a href=\"{0}{1}\">{0}{1}</a><br/>" +
"Reason For Failure: {2}<br/></body></html>",
RunLogURL, runLogID,
String.Format(serviceEntry.ReasonForFailure, channelId, armId));
또는 당신은이 작업에 그것을 할 수 있습니다 :
serviceEntry.ReasonForFailure = "10003 Insufficient Liquid Level detected at " +
"pipettor channel ({0}) on arm ({1}) (82)";
var channelId = 87;
var armId = 42;
var reasonForFailure = String.Format(serviceEntry.ReasonForFailure, channelId, armId);
message.Body = string.Format(
"<html><body>Request is complete<br/>" +
"Service Request initiated by you is Complete<br/>" +
"Please use the following link to access " +
"<a href=\"{0}{1}\">{0}{1}</a><br/>" +
"Reason For Failure: {2}<br/></body></html>",
RunLogURL, runLogID, reasonForFailure);
이 문자열에서 문자가 대체되지 않습니다. 내 의도는이 변수의 값을 그대로두고 아무것도 대체하지 않는 것입니다. 예외가 발생했습니다. 입력 문자열이 올바른 형식이 아닙니다. –
아, 알겠습니다. 위의 첫 번째 예제가 그 문제를 해결할 것이라고 생각합니다. 변수에는 두 개의 닫는 중괄호가 있는데'String.Format'은 오직 하나만 필요합니다. –
주의 두 번째와 세 번째 예제에서 입력 문자열을 수정해야했습니다 (여기서 변수 값에 string.format을 사용했습니다). –
이 중복인가? http://stackoverflow.com/questions/91362/how-to-escape-braces-curly-brackets-in-a-format-string-in-net –
단일 문자열을 사용하여이 작업을 수행 할 수 있습니까? 형식 ...? – MethodMan
예, 바깥 쪽의'string.Format'은 아무 것도하지 않습니다. –