我在同一视图中合并了创建帐户视图和登录视图。所以这是一种有两种形式的观点,但是当我提交时它们会变得混杂。如果我尝试登录,则显示错误:
Html.ValidationSummary()
两种形式都会出错。我开始将字段重命名为loginPassword,createPassword,因为否则当我提交并且密码丢失时,它会被标记为双方丢失。
将这两个表单分开以便它们可以独立地在同一个视图/页面上工作的方法是什么?
答案 0 :(得分:5)
代码现在不在我这里,所以我现在会尽力为它做一些空气代码,这显然只是一个如何做到这一点的概念,所以从表面上看。
首先,我会使用与他的'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") %>
<% } %>
控制器 - 注意 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
}
}
}
自定义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 "";
}
}
}
HTHS, 查尔斯
答案 1 :(得分:3)
我不得不处理同样的问题。我发现使用内置的ValidationSummary()无法分离验证消息。以下是两条建议:
无论哪种方式,表单字段都应该唯一命名。
我选择了解决方案#1因为我对我能够看到它的方式感到满意。但是,如果您需要根据提交的表单在两个不同的位置显示验证摘要,请使用#2。
答案 2 :(得分:2)
输入元素确实需要不同的名称/ ID,即使它们的格式不同。除非它们具有不同的名称,否则它将触发每个控件的验证逻辑,因为它根据控件的名称进行匹配。我认为你通过改变名称来区分它们是正确的。
我用复合模型设置它,也许你可以做类似的事情(注意这是不完整的):
<%= Html.TextBox( "Login.Name" ) %>
<%= Html.TextBox( "Login.Password" ) %>
<%= Html.TextBox( "NewAccount.Name" ) %>
<%= Html.TextBox( "NewAccount.Password" ) %>
<%= Html.TextBox( "NewAccount.ConfirmPassword" ) %>
在服务器端,使用绑定器的前缀选项
public ActionResult Login( [Bind(Prefix="Login")]AccountModel model )
{
...
}
你的模型看起来像是:
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; }
}
答案 3 :(得分:0)
如果表单发布到完全不同的操作,那么ModelStateDictionary应该只包含被调用的操作提供的错误。
您可以发布相关代码吗?
答案 4 :(得分:0)
我不确定是否有办法拆分ValidationSummary()。
对于表单,您可以使用各种字段创建要绑定的模型类。但是,对于你已经拥有的东西,它不会让你获得太多。