This was a nasty issue…
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentNullException: Value cannot be null. Parameter name: format at System.String.Format(IFormatProvider provider, String format, Object args) at System.String.Format(String format, Object arg0, Object arg1) --- End of inner exception stack trace ---
This is part of the stack trace I got in one of my applications which uses MonoRail. I got it while creating the
Castle.Components.Common.EmailSender.Message in order to prepare the content of the email having the name of its template file (vm):
Message msg = RenderMailMessage(templateName)
That view file defined the content and used data from
PropertyBag and from
Just to recall a resource file (resx) is bound with the controller class with this definition:
What was wrong there? I was sure
templateName passed as the parameter was correct – it for sure pointed to correct vm file. Moreover, that piece of code was defined in a superclass which was extended by this particular controller and another one which also could send this email. Of course there was no problem with sending email by the latter.
The problem here was I used this construction in the vm file:
$string.format($text.someText, $param1, $param2)
And for some reason I forgot to bind the appropriate resource file (the one referenced with
$text) with one of the controllers. As a result
string.format failed because
$param2 couldn’t be injected into string which was not found.