Возможная ошибка в ASP.NET MVC с заменой значений формы - PullRequest
40 голосов
/ 27 февраля 2009

У меня, похоже, проблема с ASP.NET MVC в том, что если у меня есть несколько форм на странице, которые используют одно и то же имя в каждой, но в качестве разных типов (радио / скрытый / и т. Д.), То когда первая форма отправляет сообщение (я выбираю радиокнопку «Дата», например), если форма перерисовывается (скажем, как часть страницы результатов), у меня возникает проблема, связанная со скрытым значением SearchType на остальные формы изменяются на последнее значение переключателя (в данном случае SearchType.Name).

Ниже приведен пример формы для сокращения.

<% Html.BeginForm("Search", "Search", FormMethod.Post); %>
  <%= Html.RadioButton("SearchType", SearchType.Date, true) %>
  <%= Html.RadioButton("SearchType", SearchType.Name) %>
  <input type="submit" name="submitForm" value="Submit" />
<% Html.EndForm(); %>

<% Html.BeginForm("Search", "Search", FormMethod.Post); %>
  <%= Html.Hidden("SearchType", SearchType.Colour) %>
  <input type="submit" name="submitForm" value="Submit" />
<% Html.EndForm(); %>

<% Html.BeginForm("Search", "Search", FormMethod.Post); %>
  <%= Html.Hidden("SearchType", SearchType.Reference) %>
  <input type="submit" name="submitForm" value="Submit" />
<% Html.EndForm(); %>

Результирующий источник страницы (это будет частью страницы результатов)

<form action="/Search/Search" method="post">
  <input type="radio" name="SearchType" value="Date" />
  <input type="radio" name="SearchType" value="Name" />
  <input type="submit" name="submitForm" value="Submit" />
</form>

<form action="/Search/Search" method="post">
  <input type="hidden" name="SearchType" value="Name" /> <!-- Should be Colour -->
  <input type="submit" name="submitForm" value="Submit" />
</form>

<form action="/Search/Search" method="post">
  <input type="hidden" name="SearchType" value="Name" /> <!-- Should be Reference -->
  <input type="submit" name="submitForm" value="Submit" />
</form>

Пожалуйста, кто-нибудь еще с RC1 может это подтвердить?

Может быть, это потому, что я использую перечисление. Я не знаю. Я должен добавить, что я могу обойти эту проблему, используя теги input () для скрытых полей вручную, но если я использую теги MVC (<% = Html.Hidden (...)%>), .NET MVC заменяет их каждый раз.

Большое спасибо.

Обновление:

Сегодня я снова видел эту ошибку. Кажется, что это обрезает голову, когда вы возвращаете опубликованную страницу и используете MVC для установки скрытых тегов формы с помощью помощника HTML. Я связался с Филом Хааком по этому поводу, потому что я не знаю, куда еще обратиться, и я не верю, что это ожидаемое поведение, как указано Дэвидом.

Ответы [ 12 ]

1 голос
/ 02 сентября 2009

Это может быть «разработано», но это не то, что задокументировано:

Public Shared Function Hidden(  

  ByVal htmlHelper As System.Web.Mvc.HtmlHelper,  
  ByVal name As String, ByVal value As Object)  
As String  

Член System.Web.Mvc.Html.InputExtensions

Сводка: возвращает скрытый тег ввода.

Параметры:
htmlHelper: помощник HTML.
name: имя поля формы и ключ System.Web.Mvc.ViewDataDictionary, используемый для поиска значения.
значение: значение скрытого ввода. Если ноль, ищет значение System.Web.Mvc.ViewDataDictionary, а затем System.Web.Mvc.ModelStateDictionary для значения.

Казалось бы, это предполагает, что ТОЛЬКО когда параметр значения равен нулю (или не указан), HtmlHelper ищет другое значение в другом месте.

В моем приложении есть форма, в которой: html.Hidden ("remote", True) отображается как <input id="remote" name="remote" type="hidden" value="False" />

Обратите внимание, что значение переопределяется содержимым словаря ViewData.ModelState.

Или я что-то упустил?

0 голосов
/ 03 июня 2015

Как предлагали другие, я использовал прямой HTML-код вместо использования HtmlHelpers (TextBoxFor, CheckBoxFor, HiddenFor и т. Д.).

Проблема при таком подходе заключается в том, что вам нужно поместить атрибуты name и id в виде строк. Я хотел сохранить свойства моей модели строго типизированными, поэтому использовал NameFor и IdFor HtmlHelpers.

<input type="hidden" name="@Html.NameFor(m => m.Name)" id="@Html.IdFor(m=>m.Name)" value="@Html.AttributeEncode(Model.Name)">

Обновление: Вот удобное расширение HtmlHelper

    public static MvcHtmlString MyHiddenFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null)
    {
        return new MvcHtmlString(
            string.Format(
                @"<input id=""{0}"" type=""hidden"" value=""{1}"" name=""{2}"">",
                helper.IdFor(expression),
                helper.NameFor(expression),
                GetValueFor(helper, expression)
            ));
    }

    /// <summary>
    /// Retrieves value from expression
    /// </summary>
    private static string GetValueFor<TModel, TValue>(HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
    {
        object obj = expression.Compile().Invoke(helper.ViewData.Model);
        string val = string.Empty;
        if (obj != null)
            val = obj.ToString();
        return val;
    }

Затем вы можете использовать его как

@Html.MyHiddenFor(m => m.Name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...