Skip to content

Instantly share code, notes, and snippets.

@KalinovDmitri
Created August 23, 2018 20:57
Show Gist options
  • Save KalinovDmitri/da7c39401f10e8bfea600ccd6716f735 to your computer and use it in GitHub Desktop.
Save KalinovDmitri/da7c39401f10e8bfea600ccd6716f735 to your computer and use it in GitHub Desktop.
@using NetMvcExample.Models
@model LoginViewModel
<style type="text/css">
.margin-top-2 {
margin-top: 2vh;
}
</style>
<div id="form-placeholder">
@using (Ajax.BeginForm("Login", "Account", new { }, new AjaxOptions
{
HttpMethod = "POST",
OnBegin = "loginStarted",
OnSuccess = "loginSuccess",
OnFailure = "loginFailed",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "login_form_container"
}, new { @id = "loginForm" }))
{
@Html.ValidationSummary(true, null, new { @class = "alert alert-danger" })
<div class="row">
<div class="col-md-12">
<div class="row margin-top-2">
<div class="col-md-2">
<span>User Name:</span>
</div>
<div class="col-md-8">
@Html.TextBoxFor(m => m.UserName, new { @class = "k-textbox" })
@Html.ValidationMessageFor(m => m.UserName)
</div>
</div>
<div class="row margin-top-2">
<div class="col-md-2">
<span>Password:</span>
</div>
<div class="col-md-8">
@Html.PasswordFor(m => m.Password, new { @class = "k-textbox" })
@Html.ValidationMessageFor(m => m.Password)
</div>
</div>
<div class="row margin-top-2">
<div class="col-md-2">
<span>Message:</span>
</div>
<div class="col-md-8">
@Html.TextAreaFor(m => m.Message, new { @class = "k-textbox", rows = "5", cols = "30" })
@Html.ValidationMessageFor(m => m.Message)
</div>
</div>
<div class="row margin-top-2">
<div class="col-md-2">
<button type="submit" class="btn btn-primary pull-left">Отправить</button>
</div>
</div>
</div>
</div>
}
<script type="text/javascript">
$(document).ready(function () {
var loginForm = $("#loginForm");
loginForm.on("submit", function (e) {
e.stopImmediatePropagation();
e.preventDefault();
var validator = loginForm.validate();
if (!validator.form()) {
validator.destroy();
return;
} else {
validator.destroy();
}
$.ajax({
url: e.target.getAttribute("action"),
method: e.target.getAttribute("method"),
contentType: "application/x-www-form-urlencoded",
data: loginForm.serialize(),
type: "json",
beforeSend: function (xhr) {
xhr.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
},
success: function (data, status, xhr) {
console.log(xhr.responseText);
$("#login_form_container").replaceWith(xhr.responseText);
},
error: function (xhr, error) {
console.log(xhr.responseText);
if (xhr) {
if (xhr.status === 302) {
window.location.href = xhr.responseText;
}
}
}
});
});
});
</script>
</div>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web.Mvc;
using NetMvcExample.Models;
namespace NetMvcExample.Controllers
{
public class AccountController : Controller
{
[HttpGet]
public ActionResult Login()
{
return View(new LoginViewModel());
}
[HttpPost]
public async Task<ActionResult> Login(LoginViewModel viewModel)
{
if (!ModelState.IsValid)
{
return PartialView(viewModel);
}
await Task.Delay(2000).ConfigureAwait(false); // emulate long work
return new CustomStatusCodeResult(HttpStatusCode.Redirect, Url.Action("Index", "Home"));
}
private ActionResult BadRequest(ModelStateDictionary modelState)
{
var errors = modelState.Values
.Where(x => x.Errors.Count > 0)
.SelectMany(x => x.Errors)
.Select(x => x.ErrorMessage);
var errorsText = string.Join("\r\n", errors);
return new CustomStatusCodeResult(HttpStatusCode.BadRequest, errorsText);
}
}
}
using System;
using System.Net;
namespace System.Web.Mvc
{
public class CustomStatusCodeResult : HttpStatusCodeResult
{
private readonly string _content;
public CustomStatusCodeResult(HttpStatusCode statusCode, string content) : base(statusCode)
{
_content = content;
}
public override void ExecuteResult(ControllerContext context)
{
base.ExecuteResult(context);
context.HttpContext.Response.Write(_content);
}
}
}
@using NetMvcExample.Models
@model LoginViewModel
<div id="login_form_container">
@Html.Partial("_LoginForm", Model)
</div>
using System;
using System.ComponentModel.DataAnnotations;
namespace NetMvcExample.Models
{
public class LoginViewModel
{
[Required]
[DataType(DataType.Text)]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Required]
[DataType(DataType.Text)]
public string Message { get; set; }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment