I am working on a simple contact system where i need to display a value from a querystring in the subject field of the sent email.
Today has been a slow descent into madness as this has failed to work in every way i have tried.
I am using Umbraco 4.7.2 with Ubootstrap (bootstrap by twitter) and modifying the contact form found within. Below is the cshtml of my contact form macro
@using System.Text @using System.Collections.Generic; @using Bootstrap.Logic.Utils @using umbraco.MacroEngines @inherits DynamicNodeContext @{ dynamic form = Context.Request.Form.ToDynamic(); if (IsPost) { if (!Context.IsValidAntiForgery()) { ModelState.AddFormError(@Dictionary.InvalidPost); } if (MainHelper.IsEmpty(form.Name)) { ModelState.AddError("name", @Dictionary.FormNameValidation); } if (!MainHelper.IsEmail(form.Email)) { ModelState.AddError("email", @Dictionary.FormEmailValidation); } if (MainHelper.IsEmpty(form.Enquiry)) { ModelState.AddError("enquiry", @Dictionary.FormCommentValidation); } } if (!IsPost || !ModelState.IsValid) { @Html.Raw(library.RemoveFirstParagraphTag(Model.FormText.ToString())) <form method="post" action="@Model.Url"> <fieldset> <legend>@Parameter.subject </legend> <div class="clearfix @Library.If(!ModelState.IsValidField("name"), "error")"> @Html.Label(@Dictionary.FormName, "name") <div class="input">@Html.TextBox("name", form.Name, new { @class = "xlarge" }) @if (!ModelState.IsValidField("name")) { <span class="help-inline">@string.Join(". ", @ModelState["name"].Errors)</span> } </div> </div> <div class="clearfix"> @Html.Label(@Dictionary.AddressName, "address1") <div class="input">@Html.TextBox("address1", form.Address1, new { @class = "xlarge" })</div> </div> <div class="clearfix"> @Html.Label("Add 2", "address2", new { @class = "hide" }) <div class="input">@Html.TextBox("address2", form.Address2, new { @class = "xlarge" })</div> </div> <div class="clearfix @Library.If(!ModelState.IsValidField("email"), "error")"> @Html.Label(@Dictionary.FormEmail, "email") <div class="input">@Html.TextBox("email", form.Email, new { @type = "email", @class = "xlarge" }) @if (!ModelState.IsValidField("email")) { <span class="help-inline">@string.Join(". ", @ModelState["email"].Errors)</span> } </div> </div> <div class="clearfix @Library.If(!ModelState.IsValidField("name"), "error")"> @Html.Label(@Dictionary.FormComment, "enquiry") <div class="input">@Html.TextArea("enquiry", form.Enquiry, new { @rows = 5, @cols = 25, @class = "xlarge" }) @if (!ModelState.IsValidField("enquiry")) { <span class="help-inline">@string.Join(". ", @ModelState["enquiry"].Errors)</span> } </div> </div> @Context.GetAntiForgeryHtml() </fieldset> <div class="actions"> <button id="SubmitForm" type="submit" class="btn">@Dictionary.Send</button> </div> </form> @Html.ValidationSummary(@Dictionary.FormValidationSummary, new { @class = "alert-message block-message error" }) } else { var ok = SendForm(form, @Parameter.subject); if (!ok) { <div id="errorMailSettings"> @Model.ErrorMessage </div> } else { // Set Thankyou text from our contact node <div id="thankYou"> <h2>@Model.ThankYouHeaderText</h2> @Model.ThankYouMessageText @Parameter.subject </div> } } } @functions { public bool SendForm(dynamic form, string queryParam) { // Get the variables from the form and set them in strings string strName = Library.StripHtml(form.Name).ToString(); string strAddressLine1 = Library.StripHtml(form.Address1).ToString(); string strAddressLine2 = Library.StripHtml(form.Address2).ToString(); string strEmailFrom = Library.StripHtml(form.Email).ToString(); string strMessage = Library.StripHtml(form.Enquiry).ToString(); // Lets set the values passed in from the Macro string strEmailTo = Model.EmailTo.ToString(); string strEmailSubject = queryParam.ToString(); var now = DateTime.Now; var strTime = String.Format("{0:HH:mm:ss}", now); var strDate = String.Format("{0:dd/MM/yyyy}", now); // Let's Replace the placeholders in the email message body var strEmailBody = new StringBuilder(Model.EmailBody.ToString()); strEmailBody.Replace("[Name]", strName); // Find and Replace [Name] strEmailBody.Replace("[AddressLine1]", strAddressLine1); // Find and Replace [AddressLine1] strEmailBody.Replace("[AddressLine2]", strAddressLine2); // Find and Replace [AddressLine2] strEmailBody.Replace("[Email]", strEmailFrom); // Find and Replace [Email] strEmailBody.Replace("[Message]", strMessage); // Find and Replace [Message] strEmailBody.Replace("[Time]", strTime); // Find and Replace [Time] strEmailBody.Replace("[Date]", strDate); // Find and Replace [Date] // Now the email is sent out to the owner, lets send out an email // to let the user know we have recieved their email & will respond shortly string strEmailReplySubject = Model.EmailReplySubject.ToString(); var strEmailReplyBody = new StringBuilder(Model.EmailReplyBody.ToString()); strEmailReplyBody.Replace("[Name]", strName); // Find and Replace [Name] return MainHelper.TrySendMail(strEmailTo, strEmailSubject, strEmailBody.ToString()) && MainHelper.TrySendMail(strEmailFrom, strEmailReplySubject, strEmailReplyBody.ToString()); } }
I can verify that @Parameter.subject works in the part of the macro that defines the legend field for the form, as the value i pass to the macro from the querystring subject is displayed here.
the part of the code that sends the mail (the sendform function) refuses my every attempt to tell it what the querystring is. The parameter is supposed to be used as the subject of the mail sent, but it is invariably empty.
i started out trying to pull the querystring with request, that failed, tried with httpcontext, failed, now im trying with a macro parameter and it works in one part...
Dynamic subject in contact mail from Querystring
I am working on a simple contact system where i need to display a value from a querystring in the subject field of the sent email.
Today has been a slow descent into madness as this has failed to work in every way i have tried.
I am using Umbraco 4.7.2 with Ubootstrap (bootstrap by twitter) and modifying the contact form found within. Below is the cshtml of my contact form macro
the macro code:
I can verify that @Parameter.subject works in the part of the macro that defines the legend field for the form, as the value i pass to the macro from the querystring subject is displayed here.
the part of the code that sends the mail (the sendform function) refuses my every attempt to tell it what the querystring is. The parameter is supposed to be used as the subject of the mail sent, but it is invariably empty.
i started out trying to pull the querystring with request, that failed, tried with httpcontext, failed, now im trying with a macro parameter and it works in one part...
please help, i cant stop trying to fix it :D
Fixed it by placing @Parameter.subject in a hidden textfield and then using striphtml to put it in an argument on the function...
is working on a reply...