форма сериализации пуста на MVC 5 ajax - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь войти через модель, включая asp net MVC 5, однако я не могу получить данные из формы, используя сериализацию, ошибок нет, просто внутри данных ничего не отображается

@using (Html.BeginForm("Login", "Account", new { returnUrl = Request.QueryString["ReturnUrl"] }, FormMethod.Post, new { id = "formModal" }))
            {
                @Html.AntiForgeryToken(); 

                @Html.ValidationSummary(true, "", new { @class = "text-danger" })

                <div class="container">
                    <div class="form-login">
                        <div class="panel panel-default">
                            <div class="panel-heading">
                                <div class="panel-title">Login</div>
                            </div>

                            <div class="panel-body">

                                <div class="form-group">
                                    <div class="input-group mb-3">
                                        <div class="input-group-prepend">
                                            <div class="input-group-text">
                                                <i class="fas fa-user"></i>
                                            </div>
                                        </div>
                                        @Html.EditorFor(model => model.Username, new { htmlAttributes = new { @class = "form-control", placeholder = "Username", autofocus = true } })
                                        @Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })
                                    </div>
                                </div>

                                <div class="input-group mb-3">
                                    <div class="input-group-prepend">
                                        <div class="input-group-text">
                                            <i class="fas fa-lock"></i>
                                        </div>
                                    </div>
                                    @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control", placeholder = "Password" } })
                                    @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
                                </div>

                                <div class="form-group">

                                    <button id="btnSubmit" type="submit" class="btn primary btn-lg">
                                        Entrar
                                    </button>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            }


<script type="text/javascript">

$("#btnSubmit").click(function () {
    debugger
    var formData = $('#formModal').serialize();
    $.ajax({
        type: 'POST',
        url: '/Account/Login',
        data: formData,
        async: true,
        success: function (data) {
        }
    });
    return false;
});

что я делаю не так? Я видел несколько видео, и я сделал то же самое ... Я могу добраться до контроллера, но нет данных

это контроллер

public class AccountController : Controller
{
    public ActionResult Index()
    {
        return PartialView("_PartialLogin");
    }

    [HttpPost]
    public ActionResult Login(LoginViewModel model, string ReturnUrl)
    {
        var user = Authenticate(model);

        var ticket = new FormsAuthenticationTicket(
            1,
            user.Id.ToString(),
            DateTime.Now,
            DateTime.Now.AddHours(5),
            model.RememberMe,
            user.Roles.Select(c => c.Nome).FirstOrDefault()
            );

        return Redirect(ReturnUrl);
    }
}

а вот модель просмотра

public class LoginViewModel
{
    [Required]
    [StringLength(8)]
    public string Username { get; set; }
    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
    public bool RememberMe { get; set; }
}

несмотря ни на что, я не могу получить данные из формы, используя jquery, это всегда пусто, когда я использую serialize

EDIT

Я забыл упомянуть, эта форма внутри частичного вида, в модальном

 @model Logistica.ViewModels.LoginViewModel

@{
    Layout = null;
}

<link href="~/Content/bootstrap.css" rel="stylesheet" />
<link href="~/Content/login.css" rel="stylesheet" />
<link href="~/Content/fontawesome-all.css" />

<script src="~/scripts/jquery-3.3.1.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/bootstrap.js"></script>
<script src="~/Scripts/fontawesome/all.js"></script>

<!-- Modal -->
<div class="modal fade" id="modalLogin" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-body">



            </div>

        </div>
    </div>
</div>

Не могу поверить, что могу быть таким глупым, я думал, что это будет одним из возможных вариантов моей проблемы, формы внутри формы ...

Я звоню модальному логину из _Layout, и он был внутри формы ... Не могу поверить, что потратил на это день. Я впервые делаю проект MVC 5 в обратном направлении, потому что наш сервер IIS пока не поддерживает хост для Asp .NET Core 2.2 и совершенно забыл о форме на макете.

          <form class="form-inline my-2 my-lg-0">
                @if (User.Identity.IsAuthenticated)
                {
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                        Dropdown
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                        <a class="dropdown-item" href="#">Action</a>
                        <a class="dropdown-item" href="#">Another action</a>
                        <div class="dropdown-divider"></div>
                        <a class="dropdown-item" href="#">Something else here</a>
                    </div>
                }
                else
                {
                    <ul class="navbar-nav mr-auto">
                        <li class="nav-item">
                            @Html.Action("Index", "Account")
                            <a class="nav-link" href="#" data-toggle="modal" data-target="#modalLogin">Log In</a>
                        </li>
                    </ul>
                }
            </form>

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

Измените URL-адрес с url: '/Login/Account' на URL-адрес: '/Account/Login', потому что вашим контроллером является Учетная запись, а не Логин.Я попытался воспроизвести в местном, и это сработало

$("#btnSubmit").click(function () {
    debugger
    var formData = $('#formModal').serialize();
    $.ajax({
        type: 'POST',
        url: '/Account/Login',
        data: formData,
        async: true,
        success: function (data) {
        }
    });
    return false;
});
2 голосов
/ 09 апреля 2019

данные, которые вы публикуете, должны быть сопоставлены с одним объектом {model: {}, ReturnUrl: ""}, ReturnUrl может поступать из строки запроса, но ваши модели действий и форм отличаются.

Ваша модель формы - это модель: {}, а ваша модель действия - {модель: {}, ReturnUrl: ""}

ваши атрибуты имени на входах вашей формы должны быть model.Username, model.Password, vs Username, Password

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...