【问题标题】:Best way to support multiple forms in mvc3 with validation annotiation使用验证注释在 mvc3 中支持多种表单的最佳方式
【发布时间】:2012-03-13 10:30:28
【问题描述】:

在一个 mvc3 项目中,我想在一页上有 2 个表单。一种是注册用户,另一种是登录。

有两个提交按钮。一个注册,一个登录。

在模型中有验证注释,例如用户名是必需的,密码必须匹配等等。

问题是,验证注释相互影响。这样当注册按钮被按下时,登录用户名的验证是无效的。

我曾尝试编写部分视图,或者在一个视图中完成所有操作并编写一些自定义注释,尊重按下的按钮。

但这一切似乎都错了。这不是最好的解决方案。

实现这一目标的最佳方法是什么。

【问题讨论】:

    标签: asp.net-mvc-3 forms partial-views


    【解决方案1】:

    我处理这个问题的方式;如果您需要 2 个或更多 ViewModels 绑定到您的视图,就是创建一个包含 2 个属性的包含 ViewModel,然后将单独的 loginregister 模型分配给每个属性。例如(减去您希望添加的任何验证)

    public class LogOnViewModel {
        public string UserName { get; set; }
        public string Password { get; set; }
    }
    
    public class RegisterViewModel {
        public string UserName { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
        public string ConfirmPassword { get; set; }
    }
    
    public class WelcomeScreenViewModel {
        public LogOnViewModel LogOnModel { get; set; }
        public RegisterViewModel RegisterModel { get; set; }
    }
    

    在我的 Welcome 视图中,我会在顶部有 @model namespace.WelcomeScreenViewModel 以及指向 _LogOn 和 _Register 的 2 个部分视图,如下所示:

    @Html.Partial("_LogOn", Model.LogOnModel)
    @Html.Partial("_Register", Model.RegisterModel)
    

    这样,您的局部视图将传递给正确的模型,并且还可以作为局部视图在您的网络应用程序中的其他位置重复使用。

    【讨论】:

    • 当我这样做的时候,用户名、密码等字段总是为空。
    • 发布您的数据时?您是否在每个局部视图中都获得了指向控制器上正确操作的表单?例如Html.BeginForm("LogOn", "Account")
    • 我的 HttpPost 函数如下所示:public ActionResult Index(WelcomeScreenModel welcomeScreenModel)。这里的值为 Null。如果我将其更改为public ActionResult Index(FormCollection formCollection),则有两个值,一个用于密码,一个用于用户名。有没有办法使用 WelcomeScreenModel?
    • 您应该在每个局部视图中都有您的@Html.BeginForm("LogOn", "Account") 代码,然后每个表单将发布数据到控制器上处理这些特定视图模型的单独操作。例如[HttpPost] public ActionResult LogOn (LogOnViewModel model) {} - 您应该尽量不要来回发布不需要的数据,否则您将面临发生这种情况的风险...freshbrewedcode.com/joshbush/2012/03/05/…
    • 简而言之,使用WelcomeScreenViewModel 将数据放在屏幕上,并分离(更具体的)Action 和 ViewModel 以将数据发送回您的控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多