在ASP.Net MVC中的同一视图中分离两个表单

pup*_*eno 5 forms asp.net-mvc views

我在同一视图中合并了创建帐户视图和登录视图.所以这是一种有两种形式的观点,但是当我提交时它们会变得混杂.如果我尝试登录,则会显示错误:

Html.ValidationSummary()
Run Code Online (Sandbox Code Playgroud)

两种形式都会出错.我开始将字段重命名为loginPassword,createPassword,因为否则当我提交并且密码丢失时,它会被标记为双方丢失.

将这两个表单分开以便它们可以独立地在同一个视图/页面上工作的方法是什么?

Cha*_*ino 5

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

代码现在不在我身边所以我现在会尽力为它做一些空气代码,这显然只是一个如何做到这一点的概念,所以把它当作面值.

首先,我将使用与他的'EntryPageModel'建议的tvanfosson相同的设置.

查看 - 注意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") %>
<% } %>
Run Code Online (Sandbox Code Playgroud)

控制器 - 注意ViewData ["PostedForm"]

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义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 "";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

HTHs,查尔斯


小智 3

我不得不处理同样的问题。我发现无法使用内置的 ValidationSummary() 来分离验证消息。这里有两个建议:

  1. 将验证摘要放置在可以适用于两种表单的区域。例如,如果登录表单和注册表单并排放置,请将验证摘要放置在两个表单上方居中的 div 中。我在Mahalo 登录页面上找到了这种风格的示例。
  2. 在适当的控制器操作方法中,向 ViewData 添加一些内容,指示调用了哪个操作。在视图中,每个表单都会有一个 ValidationSummary,但每个表单都会根据您添加到 ViewData 的内容有条件地呈现。

无论哪种方式,表单字段都应该具有唯一的名称。

我选择了解决方案#1,因为我对它的外观感到满意。但是,如果您需要根据提交的表单将验证摘要显示在两个不同的位置,请选择#2。