将表单添加到布局

Posted

技术标签:

【中文标题】将表单添加到布局【英文标题】:Add form to layout 【发布时间】:2022-01-12 23:51:28 【问题描述】:

我需要在每个页面的头部添加一个登录弹出窗口,所以我自然想将它作为局部视图添加到布局中。

问题是,布局没有页面模型。

我们确实使用了每个页面都继承自的 BasePageModel,我可以在其中添加 2 个字符串作为用户名/密码。但是布局如何看到这些字段?

【问题讨论】:

您可以使用引导模式作为弹出窗口,并在引导模式上动态加载部分登录视图。 【参考方案1】:

您可以像指定标准内容页面一样为布局页面指定模型:

@model BasePageModel
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    ...

然后您的属性可以通过布局页面的Model 属性访问。 BasePageModel 也将传递给您添加到布局中的任何部分(除非您为部分指定不同的模型),因此您也可以访问其中的属性。

【讨论】:

【参考方案2】:

我需要在每个页面的标题中添加一个登录弹出窗口,所以很自然 我想将它作为局部视图添加到布局中。

根据您的描述,我针对这种情况做了一个演示。但我不使用每个页面都继承自的 BasePageModel。

下面的demo,希望对你有帮助。

1.添加登录页面,页面模型,post方法

登录.cshtml.cs:

 public class LoginModel : PageModel
    
      
        [BindProperty]
        public string Username  get; set; 

        [BindProperty]
        public string Password  get; set; 

        public string Msg  get; set; 

        public void OnGet()
        
        

        public IActionResult OnPost(string Username, string Password)
        
           //do your other things...
            return Page();
        
    

登录.cshtml:

@page
@model Login.Pages.LoginModel
@

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Login</title>
</head>
<body>

    <h3>Login Form</h3>
    @Model.Msg
    <form method="post" asp-page="Login">
        <table>
            <tr>
                <td>Username</td>
                <td><input type="text" asp-for="@Model.Username" /></td>
            </tr>
            <tr>
                <td>Password</td>
                <td><input type="password" asp-for="@Model.Password" /></td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td><input type="submit" value="Login" /></td>
            </tr>
        </table>
    </form>
</body>
</html>
    在布局中添加登录表单。使用名称属性:将 input type="text" asp-for="@Model.Username" 更改为 input type="text" name= “用户名”
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>

                    </ul>
                   </div>
                        <div>

                            <fieldset>

                                <div class="container">
                                    <div class="row">
                                        <div class="col-xs-12">

                                            <button id="btnShowModal" type="button"
                                                    class="btn btn-sm btn-default pull-left col-lg-11 button button4">
                                                login
                                            </button>

                                            <div class="modal fade" tabindex="-1" id="loginModal"
                                                 data-keyboard="false" data-backdrop="static">
                                                <div class="modal-dialog modal-lg">
                                                    <div class="modal-content">
                                                        <div class="modal-header">
                                                            <button type="button" class="close" data-dismiss="modal">
                                                                ×
                                                            </button>

                                                        </div>
                                                        <div class="modal-body">
                                                            <form method="post" asp-page="Login">
                                                                <table border="0" cellpadding="2" cellspacing="2">
                                                                    <tr>
                                                                        <td>Username</td>
                                                                        <td><input type="text" name="Username"></td>
                                                                    </tr>
                                                                    <tr>
                                                                        <td>Password</td>
                                                                        <td><input type="password" name="Password"></td>
                                                                    </tr>
                                                                    <tr>
                                                                        <td>&nbsp;</td>
                                                                        <td><input type="submit" value="Login"></td>
                                                                    </tr>
                                                                </table>
                                                            </form>

                                                        </div>

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

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

                </div>
        </nav>
       
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - Login - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
    <script type="text/javascript">
        $(document).ready(function () 
            $("#btnShowModal").click(function () 
                $("#loginModal").modal('show');
            );

            $("#btnHideModal").click(function () 
                $("#loginModal").modal('hide');
            );
        );
    </script>
</body>
</html>


结果:

【讨论】:

以上是关于将表单添加到布局的主要内容,如果未能解决你的问题,请参考以下文章

将行添加到表单布局

将 UIViewController 元素添加到 xib 图形布局中

CardLayout 中的 ExtJS 表单

Bootstrap 表单

将 Xamarin 表单中的布局粘贴到底部

[Vue项目实战]登录功能实现