Есть несколько способов сделать это, если мне кажется, что я правильно понимаю ваш вопрос.
Мой контроллер будет выглядеть так:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ContactUs(DatabaseModelExtensions.ContactRequest model) // Pass model of which I am submitting a form against to retrieve data inside this HTTPPost Controller
{
// Create database object to map extension class to it.
ContactRequest NewEntry = new ContactRequest();
if (ModelState.IsValid)
{
// Map database object to the model passed and then insert.
NewEntry.Name = model.Name;
NewEntry.Email = model.Email;
NewEntry.Message = model.Message;
NewEntry.Timestamp = System.DateTime.Now;
// Insert new entry into database for historical tracking
NewEntry.Insert();
// Clear modelstate (clearing form fields)
// ModelState.Clear(); -- Does not work with an Ajax call - requires postback.
// Email user about their contact request and also send admins a summary of the contact request.
// Create new UserMailer Object so that we can invoke this class and work with it's functions/properties.
var Mailer = new UserMailer();
// Instantiated the 'msg' variable that will allow for us to invoke Mailer.ContactSubmission(), this function passes a series of parameters so that we can reference them inside
// our UserMailer.cs class which then gets passed to a mail template called ContactSubmission.cshtml under the Views -> UserMailer folder
var msg = Mailer.ContactSubmission(firstName: model.Name, email: model.Email, telephone: model.Telephone);
// Same as above except we will be sending out the management notification.
var msg1 = Mailer.AdminContactSubmission(firstName: model.Name, email: model.Email, datetime: System.DateTime.Now, message: model.Message, telephone: model.Telephone);
// Invoke the .Send() extended function that will actually execute everything to send an SMTP mail Request.
msg1.Send();
msg.Send();
// Return our content back to the page asynchronously also create a quick snippet of js to slide the message up after a few seconds.
return Content(new MvcHtmlString(@"
<div id='sendmessage'>
Your message has been sent, Thank you!
</div>
<script type='text/javascript'>
setTimeout(function () { jQuery('#results').slideUp('fast') }, 3000);
</script>").ToString());
}
// Return our Error back to the page asynchronously.
return Content(new MvcHtmlString(@"
<div id='errormessage'>
An error has occured, please try again in a few moments!
</div>
<script type='text/javascript'>
setTimeout(function () { jQuery('#results').slideUp('fast') }, 3000);
</script>").ToString());
}
Мой взгляд будет выглядетьчто-то вроде:
<div id="results">Content would be returned in place of this div.</div>
@using (Ajax.BeginForm("ContactUs", "Home",
new AjaxOptions
{
LoadingElementId = "loading",
OnBegin = "DisableForm('contactform')",
UpdateTargetId = "results",
OnSuccess = "resetForm('contactform'); removeLoading()"
}, new { @id = "contactform" }))
{
@Html.ValidationSummary(true)
<div id="results">
</div>
<ul class="cform">
<li><label for="name">Name:</label>
@Html.TextBoxFor(Model => Model.Name, new { @name = "name", @id = "name", @class = "fancyinput reginput" })
@Html.ValidationMessageFor(Model => Model.Name)
</li>
<li><label for="email">E-mail:</label>
@Html.TextBoxFor(Model => Model.Email, new { @name = "email", @id = "email", @class = "fancyinput reginput" })
@Html.ValidationMessageFor(Model => Model.Email)
</li>
<li><label for="telephone">Telephone:</label>
@Html.TextBoxFor(Model => Model.Telephone, new { @name = "telephone", @id = "telephone", @class = "fancyinput reginput" })
@Html.ValidationMessageFor(Model => Model.Telephone)
</li>
<li><label for="message">Message:</label>
@Html.TextAreaFor(Model => Model.Message, new { @name = "message", @id = "message", @class = "fancyinputarea", @rows = "10", @cols = "62" })
@Html.ValidationMessageFor(Model => Model.Message)
</li>
<li><input type="submit" value="Submit" class="btn" name="submit"/><img id="loading" style="display: none;" src="../../Content/img/loading27.gif" alt="Loading..." /></li>
</ul>
}
Это простой пример страницы контактов с полной функциональностью для ajax и предупреждения пользователя о том, когда что-то происходит, через загрузочный div с css-фоном анимированного GIF, а также позволяетони знают, что их результат успешен / неуспешен.
Вы также можете добиться аналогичного эффекта и больше, используя ActionResult, вызывая его и возвращая Content
public ActionResult SubmitForm(int id)
{
return Content(new MvcHtmlString("<div>test test</div>").ToString());
}
and the jQuery AJAX side of things would be;
$.ajax({
type: 'POST',
url: @Url.Action("SubmitForm","VotingController"),
data: { id : @Model.UserId },
success: success, // Javascript function to call back on success.
dataType: dataType // data type expected back from the server
});
Это более поздняя половина - просто считайте егопсевдокод, как я только что написал на лету, но должен работать с небольшими изменениями.
Надеюсь, это поможет вам, и я не смеюсь над тем, что что-то сделал неправильно, однако, если я сделал икто-то может показать мне лучший способ, который я бы тоже хотел улучшить сам:)