将单独的模型绑定到主布局

时间:2018-04-02 14:44:51

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

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

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

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

<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的新成员。

1 个答案:

答案 0 :(得分:2)

从不,永远不要将模型附加到布局。只是不要。这里正确的方法是视图组件。创建一个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