Nu behöver jag lite hjälp, eller i alla fall pekare till hur jag ska göra.
Jag har i Visual Studio 2015 en HTML-sida med ett formulär. Formuläret har ett par text-fält (bladn annat en epost-adress), två file upload controls och en submit-knapp, allt är normal HTML (med Bootstrap och lite jQuery för att sätta en disable på submit-knappen om inte alla fält är korrekta).
Jag har sedan en C#-controller som anropas när webformuläret skickas till servern. Controllern läser in värdena i input-fälten, sparar ner de uppladdade filerna lokalt och skapar sedan ett nytt email där de uppladdade filerna bifogas. Detta email skickas till den adress som angetts i webbformuläret.
Allt fungerar bra, mailet skcikas och jag får texten "Thank you" tillbaka i webbläsaren.
Frågan är nu hur jag får webbläsaren att gå till en specifik webbsida istället för att visa texten.
Jag har provat att skicka en sträng med HTML-kod, men det kommer ändå bara över som text, man ser HTML-koden i klartext.
Antingen om det finns ett sätt att ange att HttpResponseMessage är HTML-kod (nån header som innehåller content-type kanske?) eller om det finns nån metod som returnerar en redirect till en existerande webbsida... Förslag?
Jag har i Visual Studio 2015 en HTML-sida med ett formulär. Formuläret har ett par text-fält (bladn annat en epost-adress), två file upload controls och en submit-knapp, allt är normal HTML (med Bootstrap och lite jQuery för att sätta en disable på submit-knappen om inte alla fält är korrekta).
HTML-kod:
<form name="form1" method="post" enctype="multipart/form-data" action="api/upload">
<div class="row">
<div class="col-sm-3">
<div class="form-group">
<label for="firstName">First Name</label>
<input type="text" class="form-control" name="FirstName" id="firstName" placeholder="First Name" data-required="yes">
</div>
</div>
<div class="col-sm-3">
<div class="form-group">
<label for="lastName">Last Name</label>
<input type="text" class="form-control" name="LastName" id="lastName" placeholder="Last Name" data-required="yes">
</div>
</div>
<div class="col-sm-6">
<!-- File Upload - Application -->
<label for="uploadApplication">Application (PDF)</label>
<div class="fileinput fileinput-new input-group" id="uploadApplication" name="UploadApplication" data-provides="fileinput">
<div class="form-control" data-trigger="fileinput"><i class="glyphicon glyphicon-file fileinput-exists"></i> <span class="fileinput-filename"></span></div>
<span class="input-group-addon btn btn-default btn-file"><span class="fileinput-new">Select file</span><span class="fileinput-exists">Change</span><input type="file" name="..."></span>
<a href="#" class="input-group-addon btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label for="firstName">Agency Name</label>
<input type="text" class="form-control" name="AgencyName" id="agencyName" placeholder="Name of Agency" data-required="yes">
</div>
</div>
<div class="col-sm-6">
<!-- File Upload - E&O -->
<label for="uploadErrorOmissions">E&O (PDF)</label>
<div class="fileinput fileinput-new input-group" id="uploadErrorOmissions" name="UploadErrorOmissions" data-provides="fileinput">
<div class="form-control" data-trigger="fileinput"><i class="glyphicon glyphicon-file fileinput-exists"></i> <span class="fileinput-filename"></span></div>
<span class="input-group-addon btn btn-default btn-file"><span class="fileinput-new">Select file</span><span class="fileinput-exists">Change</span><input type="file" name="..."></span>
<a href="#" class="input-group-addon btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label for="emailAddress">Email Address</label>
<input type="email" class="form-control" name="EmailAddress" id="emailAddress" placeholder="username@example.com">
</div>
</div>
<div class="col-sm-6">
</div>
</div>
<div class="row">
<div class="col-sm-12">
<button type="submit" class="btn btn-default btn-primary" id="btnSubmit">Submit</button>
</div>
</div>
</form>
Jag har sedan en C#-controller som anropas när webformuläret skickas till servern. Controllern läser in värdena i input-fälten, sparar ner de uppladdade filerna lokalt och skapar sedan ett nytt email där de uppladdade filerna bifogas. Detta email skickas till den adress som angetts i webbformuläret.
Kod:
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public CustomMultipartFormDataStreamProvider(string path) : base(path)
{ }
public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
{
var name = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ? headers.ContentDisposition.FileName : "NoName";
//this is here because Chrome submits files in quotation marks which get treated as part of the filename and get escaped
return name.Replace("\"",string.Empty);
}
}
public class UploadController : ApiController
{
public struct EmailData
{
public string sendTo;
public string sendFrom;
public string subject;
}
static Dictionary<string, string> fieldList = new Dictionary<string, string>();
static Dictionary<int, string> attachmentList = new Dictionary<int, string>();
public async Task<HttpResponseMessage> PostFile()
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new CustomMultipartFormDataStreamProvider(root);
try
{
StringBuilder sb = new StringBuilder(); // Holds the response body
// Read the form data and return an async task.
await Request.Content.ReadAsMultipartAsync(provider);
// This loops through the form data.
foreach (var key in provider.FormData.AllKeys)
{
foreach (var val in provider.FormData.GetValues(key))
{
fieldList.Add(key, val);
}
}
// This loops through the uploaded files.
int fileCount = 0;
foreach (var file in provider.FileData)
{
fileCount++;
FileInfo fileInfo = new FileInfo(file.LocalFileName);
string foo = fileInfo.Name;
attachmentList.Add(fileCount, fileInfo.FullName);
}
// Send email here
EmailData emaildata = new EmailData();
emaildata.sendFrom = "noreply@deep-south.com";
if (fieldList.ContainsKey("SendTo"))
{
emaildata.sendTo = fieldList["SendTo"];
}
else
{
emaildata.sendTo = "khm@deep-south.com";
}
emaildata.subject = "Agency Submission (web)";
SendEmail(emaildata,fieldList,attachmentList);
// Send response back to browser
return new HttpResponseMessage()
{
Content = new StringContent("Thank you.")
};
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
public static void SendEmail(EmailData emaildata, Dictionary<string, string> fields, Dictionary<int, string> attachments)
{
string smtpServer = "dsmail.deep-south.com";
string bodyText = "A new agency submission has been received.\n";
MailMessage message = new MailMessage(emaildata.sendFrom, emaildata.sendTo);
message.Subject = emaildata.subject;
foreach (KeyValuePair<string, string> pair in fields) {
bodyText += "\n" + pair.Key + ": " + pair.Value;
}
bodyText += "\n\n";
message.Body = bodyText;
Attachment attachment;
foreach (KeyValuePair<int, string> pair in attachments)
{
attachment = new Attachment(pair.Value);
message.Attachments.Add(attachment);
//bodyText += "\n" + pair.Key + ": " + pair.Value;
}
SmtpClient client = new SmtpClient(smtpServer);
// Credentials are necessary if the server requires the client
// to authenticate before it will send e-mail on the client's behalf.
client.UseDefaultCredentials = true;
try
{
client.Send(message);
}
catch (System.Exception ex)
{
// Console.WriteLine("Exception caught in CreateTestMessage2(): {0}", ex.ToString());
}
}
}
Allt fungerar bra, mailet skcikas och jag får texten "Thank you" tillbaka i webbläsaren.
Frågan är nu hur jag får webbläsaren att gå till en specifik webbsida istället för att visa texten.
Jag har provat att skicka en sträng med HTML-kod, men det kommer ändå bara över som text, man ser HTML-koden i klartext.
Antingen om det finns ett sätt att ange att HttpResponseMessage är HTML-kod (nån header som innehåller content-type kanske?) eller om det finns nån metod som returnerar en redirect till en existerande webbsida... Förslag?
).