使用复合视图模型进行部分视图验证

时间:2012-11-16 19:14:20

标签: c# .net asp.net-mvc-3 validation model

我有一个有两种形式的屏幕。一个允许登录到站点,另一个允许登录到ftp。

使用WelcomeScreenViewModel(组合模型)强类型登录视图。 每个表单都是一个强类型的局部视图。

以下是类定义。

public class LogOnViewModel
    {
        [LocalizedDisplayNameAttribute("username", typeof(MyLabels.labels))]
        [Required]
        public string UserName { get; set; }
        [LocalizedDisplayNameAttribute("password", typeof(MyLabels.labels))]
        [Required]
        public string Password { get; set; }
    }

    public class FTPViewModel
    {
        [LocalizedDisplayNameAttribute("username", typeof(MyLabels.labels))]
        [Required]
        public string UserName { get; set; }
        [LocalizedDisplayNameAttribute("password", typeof(MyLabels.labels))]
        [Required]
        public string Password { get; set; }
    }

    public class WelcomeScreenViewModel
    {
        public LogOnViewModel LogOnModel { get; set; }
        public FTPViewModel FTPModel { get; set; }
    }

我的主页继承了WelcomeScreenViewModel,我渲染了我的部分视图:

Html.RenderPartial(“Logon”,Model.LogOnModel);

Html.RenderPartial(“FTP”,Model.FTPModel);

我的控制器代码:

// To display blank login on load of page
public ActionResult Login(string language)
        {
            WelcomeScreenViewModel combined = new WelcomeScreenViewModel();
            combined.FTPModel = new FTPViewModel();
            combined.LogOnModel = new LogOnViewModel();
            return View(combined);
        }

// Called when clicking submit on first form
[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Logon(string language, LogOnViewModel logon)
        {
            WelcomeScreenViewModel combined = new WelcomeScreenViewModel();
            combined.FTPModel = new FTPViewModel();
            combined.LogOnModel = logon;

            if (!ModelState.IsValid)
            {
                ViewData["result"] = "Invalid login info / Informations de connexion incorrectes";

                // This is the part I can't figure out.  How do I return page with validation summary errors
                return View(logon);
            }
            else
            {
                ...
            }            
        }

到目前为止,我的问题是当我的ModelState无效时返回什么。如何返回包含验证摘要错误的页面?上面显示的代码只返回部分视图表单(不在master中)而没有验证。我究竟做错了什么?我开始使用this post,但它没有显示足够的代码来帮助我。

任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

我的代码存在2个问题。

1)两个子模型必须为每个字段指定不同的名称。

public class LogOnViewModel
    {
        [LocalizedDisplayNameAttribute("username", typeof(MyLabels.labels))]
        [Required]
        public string UserName { get; set; }
        [LocalizedDisplayNameAttribute("password", typeof(MyLabels.labels))]
        [Required]
        public string Password { get; set; }
    }

    public class FTPViewModel
    {
        [LocalizedDisplayNameAttribute("username", typeof(MyLabels.labels))]
        [Required]
        public string ftpUserName { get; set; }
        [LocalizedDisplayNameAttribute("password", typeof(MyLabels.labels))]
        [Required]
        public string ftpPassword { get; set; }
    }

2)这是用于返回验证和值的代码:

return View("~/Views/Login/Login.aspx",combined);