【问题标题】:Partial view doesn't call Http Post Method局部视图不调用 Http Post 方法
【发布时间】:2019-04-16 05:30:53
【问题描述】:

所以我在我的主页上创建了一个部分登录。表单可以正确呈现,但是每当我提交表单时它都不会调用 http post 操作结果。请参阅下面的代码以供参考。

主页:

<header class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark">
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo01" aria-controls="navbarTogglerDemo01" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarTogglerDemo01">


        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
            <li class="nav-item active">
                <a href="@Url.Action("HomePage", "Home")" class="nav-link">HOME</a>
            </li>
            <li class="nav-item">
                <a href="@Url.Action("Branchlist", "Branch")" class="nav-link">BRANCH</a>
            </li>
        </ul>
        <form class="form-inline my-2 my-lg-0">
            <div> @{Html.RenderAction("LogInBox");}</div>>
        </form>
    </div>
</header>

部分登录

@model BBLoyalty.Models.LoyaltyAccountModel

<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

@using (Html.BeginForm("LogInBox", "Home", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<div class="form-row align-items-center">

<div class="col-auto">
    <label class="sr-only" for="inlineFormInputGroup">Username</label>
    <div class="input-group mb-2">
        <div class="input-group-prepend">
            <div class="input-group-text"><i class="fas fa-user"></i> </div>
        </div>
        @Html.TextBoxFor(s => s.Username, new { @class = "form-control", placeholder = "Username", autofocus = "autofocus" })
    </div>
</div>

<div class="col-auto">
    <label class="sr-only" for="inlineFormInputGroup">Username</label>
    <div class="input-group mb-2">
        <div class="input-group-prepend">
            <div class="input-group-text"><i class="fas fa-lock"></i> </div>
        </div>
        @Html.PasswordFor(s => s.Password, new { @class = "form-control", placeholder = "Password" })
    </div>
</div>

<div class="col-auto">
    <button type="submit" class="btn btn-secondary mb-2">Log In</button>
</div>
</div>

}

HomeController.cs

    public ActionResult LogInBox()

    {
        return View();
    }


    [HttpPost]
    public ActionResult LogInBox(LoyaltyAccountModel acn)
    {
        if (ModelState.IsValid)
        {
            LoyaltyAccount ua = bbdb.LoyaltyAccounts.FirstOrDefault(x => x.Username == acn.Username && x.IsActive == true);
            if (ua != null)
            {
                string ep = eh.GetEncrypted(acn.Password, acn.Username);

                if (ua.Password == ep && ua.Type != "") // Needs to Identify the type of Account(Client/Admin) Otherwise Cannot Login
                {

                    Session["ActiveUser"] = ua.UserId;

                    if (ua.Type == "Admin" || ua.Type == "SuperUser")
                    {
                        return RedirectToAction("Index", "Maintenance");
                    }
                    else
                    {
                        return RedirectToAction("Index", "Profile");
                    }
                }
                else
                {
                    ViewBag.Message = "Incorrect Password!";

                    return View();
                }
            }
            else
            {
                ViewBag.Message = "Invalid Account!";

                return View();
            }
        }
        else
        {
            return View();
        }
    }

提交时不调用ActionResult LogInBox(LoyaltyAccountModel acn)

请帮忙。它总是调用第一个 ActionResult,即不带参数的那个。

enter image description here

【问题讨论】:

  • 如何确认没有提交?是否在 Action 方法中设置断点并尝试调试代码?
  • 你有嵌套的
    标签,一个在 Home,另一个在 partial。不支持嵌套表单。您可以在一个页面中有多个表单,但不能相互嵌套。
  • 是的,我已经说过,第一个 ActionResult 始终是被调用的那个。

标签: c# razor model-view-controller partial-views


【解决方案1】:

由于您在 Home 中有表单标签,而在部分中有另一个表单标签,这会在运行时生成嵌套表单,这是不受支持的。

从下面的代码中删除表单标签。

<form class="form-inline my-2 my-lg-0">
            <div> @{Html.RenderAction("LogInBox");}</div>>
</form>

【讨论】:

  • 你是英雄,我的朋友。我没有注意那个细节。我终于让它工作了。我已经和这个融合了几个小时了。
猜你喜欢
  • 2011-08-22
  • 2021-02-16
  • 2021-03-14
  • 2017-03-16
  • 2012-01-23
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多