【问题标题】:Binding a separate model to the main layout将单独的模型绑定到主布局
【发布时间】:2018-04-02 14:44:50
【问题描述】:

我正在 Asp.Net Core 2.0 MVC 上开发一个 Web 应用程序,有一个注册模式表单将在所有页面中使用,并且无法理解我应该如何进行用户模型绑定,因为每个页面都会有自己的模型。

例如,有一个新闻页面将使用新闻模型,而在该页面上,用户将希望注册或登录(主布局中集成了两种模式表单)。

下面是注册模式的表单部分:

<form action="/Account/RegisterAccount" method="post">
 @Html.AntiForgeryToken()
 <div class="cfield">
     <input name="username" type="text" placeholder="Username" />
 </div>
 <div class="cfield">
     <input name="email" type="text" placeholder="E-mail address" />
 </div>
 <div class="cfield">
     <input name="password" type="password" placeholder="Password" />
 </div>
 <div class="cfield">
     <input type="password" placeholder="Confirm Password" />
 </div>
 <button type="submit">Register</button>
</form>    

到目前为止,我所做的只是在没有模型的情况下提交了表单数据,但我在想也许最好找到一种方法来绑定模型,这样我也可以进行模型验证。

另外,如果有人可以就管理登录用户的最佳做法给我一个建议,那将是一个很好的帮助。

这是我在这里的第一篇文章,我对 Core 和 MVC 完全陌生。

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc


    【解决方案1】:

    从不、从不、从不将模型附加到布局。只是不要。这里正确的方法是视图组件。创建一个ViewComponents 目录并向其中添加一个类似SignUpViewComponent.cs 的类文件。在该文件中,您需要以下内容:

    public class SignUpViewComponent : ViewComponent
    {
        public async Task<IViewComponentResult> InvokeAsync()
        {
            // set up your model
            return View(model);
        }
    }
    

    视图组件支持注入,因此您可以遵循传统的 DI 模式,即添加带有您想要注入的参数的构造函数,并使用这些值在您的类上设置私有字段。如果您需要利用它来构建模型,这可以让您轻松引入上下文等内容。

    然后,创建视图Views\Shared\Components\SignUp\Default.cshtml。在该文件中,您可以根据需要将模型设置为您的注册表单模型,然后使用该模型添加您的注册表单 HTML。

    最后,在您的布局中,在您希望注册表单出现的位置添加以下行:

    @await Component.InvokeAsync("SignUp")
    

    有关视图组件的更多信息,请参阅documentation

    【讨论】:

    • 非常感谢@Chris,因为我以前不知道 ViewComponent 的存在,这让我省了很多痛苦。正如您所说,我创建了 ViewComponent 类以及组件视图,并且我只是返回了带有新用户类的视图作为参数“return View(new User());”它运行良好,并且在许多其他地方也很方便。
    • 我不明白的一件事,它的文档指示异步调用 Invoke 方法“public async Task InvokeAsync()”,但我只有一个类似的代码,那就是视图的返回。即使不需要等待,它也应该是异步的吗?
    • 视图组件总是异步的。如果您的视图组件很简单,您可以从方法中删除async 关键字并返回Task.FromResult
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多