Разделение двух форм в том же представлении в ASP.NET MVC

Ну, первый - запрет, так как ваши строки должны иметь ширину всего 79 символов. Что касается двух других вариантов, я полагаю, что это дело вкуса, но я лично предпочитаю второй вариант.

5
задан pupeno 4 June 2009 в 20:15
поделиться

5 ответов

Мне пришлось столкнуться с той же проблемой. Я обнаружил, что нет способа разделить сообщения проверки с помощью встроенного ValidationSummary (). Вот два предложения:

  1. Разместите сводку проверки в области, где она может применяться к обеим формам. Например, если формы входа и регистрации расположены рядом, разместите сводку проверки в блоке div по центру над обеими формами. Я нашел пример этого стиля на странице входа в Mahalo .
  2. В соответствующих методах действий контроллера добавьте что-нибудь в ViewData, указывающее, какое действие было вызвано. В представлении будет ValidationSummary для каждой формы, но каждая будет условно отображена на основе того, что вы добавили в ViewData.

В любом случае поля формы должны иметь уникальное имя.

Я выбрал решение №1, потому что был удовлетворен тем, как он выглядел. Но если вам нужно, чтобы сводка проверки отображалась в двух разных местах в зависимости от того, какая форма была отправлена, перейдите к пункту 2.

3
ответ дан 13 December 2019 в 22:14
поделиться

Входным элементам нужны разные имена / идентификаторы, даже если они находятся в разных формах. Если у них нет разных имен, он запускает логику проверки для каждого элемента управления, поскольку он соответствует на основе имени элемента управления. Я думаю, что вы на правильном пути, изменив имена, чтобы различать их.

Я бы настроил это с помощью составной модели, возможно, чтобы вы могли сделать что-то вроде (обратите внимание, это неполно):

<%= 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; }
}
2
ответ дан 13 December 2019 в 22:14
поделиться

Ах да, мне приходилось делать именно это раньше. Я нашел способ установить флаг в 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, Чарльз

5
ответ дан 13 December 2019 в 22:14
поделиться

Если формы отправляют совершенно разные действия, тогда ваш ModelStateDictionary должен содержать только ошибки, которые были вызваны действием, которое было вызвано.

Можете ли вы опубликовать соответствующий код?

0
ответ дан 13 December 2019 в 22:14
поделиться

Я не уверен, есть ли способ разделить ValidationSummary ().

Для ваших форм вы можете создавать классы моделей, с которыми вы будете связываться, с различными полями. Однако это не принесет вам многого по сравнению с тем, что у вас уже есть.

0
ответ дан 13 December 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: