Asp.net mvc 在ASP.NETMVC中在同一视图中分离两个窗体

Asp.net mvc 在ASP.NETMVC中在同一视图中分离两个窗体,asp.net-mvc,forms,views,Asp.net Mvc,Forms,Views,我已将“创建帐户”视图和“登录”视图合并到同一个视图中。这是一个有两种形式的视图,但当我提交时,它们会混合在一起。如果我尝试登录时出现错误,显示为: Html.ValidationSummary() 两种形式都会出现错误。我开始将字段重命名为loginPassword,createPassword,因为否则,当我提交时,密码丢失了,两边都会标记为丢失 如何将这两个表单分开,以便它们可以独立地在同一视图/页面上工作?如果表单发布到完全不同的操作,那么ModelStateDictionary应该只

我已将“创建帐户”视图和“登录”视图合并到同一个视图中。这是一个有两种形式的视图,但当我提交时,它们会混合在一起。如果我尝试登录时出现错误,显示为:

Html.ValidationSummary()
两种形式都会出现错误。我开始将字段重命名为loginPassword,createPassword,因为否则,当我提交时,密码丢失了,两边都会标记为丢失


如何将这两个表单分开,以便它们可以独立地在同一视图/页面上工作?

如果表单发布到完全不同的操作,那么ModelStateDictionary应该只包含由调用的操作提供的错误


您能发布相关代码吗?

我不确定是否有办法拆分ValidationSummary()


对于您的表单,您可以使用各种字段创建要绑定的模型类。不过,它不会让您获得比您已经获得的更多的东西。

输入元素确实需要不同的名称/id,即使它们的形式不同。除非它们有不同的名称,否则它将触发每个控件的验证逻辑,因为它基于控件的名称进行匹配。我认为通过更改名称来区分它们是正确的

我用一个复合模型来设置它,也许这样你可以做一些类似的事情(注意这是不完整的):

你的模型看起来像:

public class AccountModel
{
      public string Name { get; set; }
      public string Password { get; set; }
      public string ConfirmPassword { get; set; }
}

public class EntryPageModel
{
     public AccountModel Login { get; set; }
     public AccountModel NewAccount { get; set; }
}

我不得不处理同样的问题。我发现使用内置的ValidationSummary()无法分离验证消息。以下是两项建议:

  • 将验证摘要放置在可应用于两种表单的区域。例如,如果登录表单和注册表单并排,则将验证摘要放置在两个表单上方居中的div中。我在网上找到了这种风格的一个例子
  • 在适当的控制器操作方法中,向ViewData添加指示调用了哪个操作的内容。在视图中,每个表单都有一个ValidationSummary,但每个表单都将根据添加到ViewData中的内容有条件地呈现
  • 无论哪种方式,表单字段的名称都应该是唯一的


    我选择了解决方案1,因为我对自己能够让它看起来的方式感到满意。但是,如果您需要验证摘要显示在两个不同的位置,具体取决于提交的表单,请使用#2。

    啊,是的,我以前就必须这样做。我找到的方法是在ViewData中设置一个标志,详细说明发布的表单,然后为ValidationSummary创建自己的扩展方法

    代码现在不在我身边,所以我现在会尽我最大的努力为它做一些航空代码,很明显这只是一个如何做的概念,所以从表面上看

    首先,我会使用与tvanfosson建议的“EntryPageModel”相同的设置

    查看-注意Html.MyValidationSummary

    <% using(Html.BeginForm("NewAccount", "Account")) %>
    <% { %>
        <%= Html.MyValidationSummary("NewAccountForm") %>
    
        <%= Html.TextBox("NewAccount.FirstName") %>
        <%= Html.TextBox("NewAccount.LastName") %>
        <%= Html.TextBox("NewAccount.Email") %>
        <%= Html.Password("NewAccount.Password") %>
        <%= Html.Password("NewAccount.ConfirmPassword") %>
    <% } %>
    
    <% using(Html.BeginForm("Login", "Account")) %>
    <% { %>
        <%= Html.MyValidationSummary("LoginForm") %>
    
        <%= Html.TextBox("Login.Email") %>
        <%= Html.Password("Login.Password") %>
    <% } %>
    
    自定义html扩展

    namespace System.Web.Mvc
    {
        public static class HtmlExtensions
        {
            public static string MyValidationSummary(this HtmlHelper html, string formName)
            {
                if (!string.IsNullOrEmpty(html.ViewData["PostedForm"])
                    && (html.ViewData["PostedForm"] == formName))
                {
                    return html.ValidationSummary();
                }
    
                return "";
            }
        }
    }
    
    嗯,,
    Charles

    但是Html.ValidationSummary()会为任何表单选择所有错误。关于代码,您只需查看新创建项目的登录和创建帐户操作即可。现在我有了一个logInOrCreateAccount()方法,它显示了一个带有两个表单的视图,一个指向logIn(),另一个指向createAccount()。哦,我明白了。是的,验证摘要不是特定于表单的。您可以将其放在页面顶部的中心位置,也可以完全忽略它。用前缀写自己的名字也不难。我同意改名,它很干净,但没关系。这是我现在无法处理的验证摘要。哦!正确的。我会让ID和名称保持不同,但ValidationSummary会以两种形式捕获所有内容……我认为您每页只需要一个验证摘要。我认为这是对模型状态字典中所有错误的总结。谢谢你的代码。我需要在登录表单中显示登录操作的验证错误,在创建帐户表单中显示创建帐户操作的验证错误。将错误显示两次或远离表单对用户来说不是很友好。哦,我没有真正的模型,它只是一个表单和动作方法中的参数。这就是模板生成它的方式。我应该创建模型吗?这就是应该在ValidationSummary()中伪造的模型。。。如果只有一个方法来检测调用ValidationSummary()的视图(从而调用action),那么它可以在没有显式action参数的情况下工作!
    <% using(Html.BeginForm("NewAccount", "Account")) %>
    <% { %>
        <%= Html.MyValidationSummary("NewAccountForm") %>
    
        <%= Html.TextBox("NewAccount.FirstName") %>
        <%= Html.TextBox("NewAccount.LastName") %>
        <%= Html.TextBox("NewAccount.Email") %>
        <%= Html.Password("NewAccount.Password") %>
        <%= Html.Password("NewAccount.ConfirmPassword") %>
    <% } %>
    
    <% using(Html.BeginForm("Login", "Account")) %>
    <% { %>
        <%= Html.MyValidationSummary("LoginForm") %>
    
        <%= Html.TextBox("Login.Email") %>
        <%= Html.Password("Login.Password") %>
    <% } %>
    
    public class Account : Controller
    {
        private EntryPageModel _viewModel;
    
        public ActionResult NewAccount(FormCollection formValues)
        {
            try
            {
                //binding and validation for _viewModel.NewAccount
            }
            catch
            {
                ViewData["PostedForm"] = "NewAccountForm";
                return View("RegisterAndLogin", _viewModel);
            }
        }
    
        public ActionResult Login(FormCollection formValues)
        {
            try
            {
                //binding and validation for _viewModel.Login
            }
            catch
            {
                ViewData["PostedForm"] = "LoginForm";
                return View("RegisterAndLogin", _viewModel); //You'll want to pass in a model
            }
        }
    }
    
    namespace System.Web.Mvc
    {
        public static class HtmlExtensions
        {
            public static string MyValidationSummary(this HtmlHelper html, string formName)
            {
                if (!string.IsNullOrEmpty(html.ViewData["PostedForm"])
                    && (html.ViewData["PostedForm"] == formName))
                {
                    return html.ValidationSummary();
                }
    
                return "";
            }
        }
    }