Ну, первый - запрет, так как ваши строки должны иметь ширину всего 79 символов. Что касается двух других вариантов, я полагаю, что это дело вкуса, но я лично предпочитаю второй вариант.
Мне пришлось столкнуться с той же проблемой. Я обнаружил, что нет способа разделить сообщения проверки с помощью встроенного ValidationSummary (). Вот два предложения:
В любом случае поля формы должны иметь уникальное имя.
Я выбрал решение №1, потому что был удовлетворен тем, как он выглядел. Но если вам нужно, чтобы сводка проверки отображалась в двух разных местах в зависимости от того, какая форма была отправлена, перейдите к пункту 2.
Входным элементам нужны разные имена / идентификаторы, даже если они находятся в разных формах. Если у них нет разных имен, он запускает логику проверки для каждого элемента управления, поскольку он соответствует на основе имени элемента управления. Я думаю, что вы на правильном пути, изменив имена, чтобы различать их.
Я бы настроил это с помощью составной модели, возможно, чтобы вы могли сделать что-то вроде (обратите внимание, это неполно):
<%= 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; }
}
Ах да, мне приходилось делать именно это раньше. Я нашел способ установить флаг в ViewData, детализирующий, какая форма была опубликована, а затем я создал свой собственный метод расширения для ValidationSummary.
Код не со мной сейчас, поэтому я постараюсь сделать что-нибудь Air code для него сейчас, очевидно, это просто концепция того, как это сделать, так что принимайте это за чистую монету.
Для начала я бы использовал ту же настройку, что и tvanfosson, предложенный с его 'EntryPageModel'.
View - note 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 "";
}
}
}
HTH, Чарльз
Если формы отправляют совершенно разные действия, тогда ваш ModelStateDictionary должен содержать только ошибки, которые были вызваны действием, которое было вызвано.
Можете ли вы опубликовать соответствующий код?
Я не уверен, есть ли способ разделить ValidationSummary ().
Для ваших форм вы можете создавать классы моделей, с которыми вы будете связываться, с различными полями. Однако это не принесет вам многого по сравнению с тем, что у вас уже есть.