Возможная ошибка в ASP.NET MVC с формой оценивает быть замененным

Полагаю, вам проще управлять состоянием вашего приложения. Например, вы можете просто удалить обработчик закрытия окна после того, как закончите с функцией.

function getLUTKey(key){
// Write txt file to user's file system 
var fso, fh;
fso = new ActiveXObject('Scripting.FileSystemObject');
fh = fso.CreateTextFile('PartID.txt', true);     
fh.Write(key);          
fh.close();
window.onunload = null;
self.close();
}
41
задан 6 revs, 2 users 100% 13 October 2011 в 17:55
поделиться

5 ответов

Да, это поведение в настоящее время дизайном. Даже при том, что Вы явно устанавливаете значения, если Вы отправляете назад на тот же URL, мы смотрим в образцовом состоянии и используем значение там. В целом это позволяет нам отображать значение, которое Вы отправили на обратной передаче, а не исходном значении.

существует два возможных решения:

уникальные имена Использования Решения 1

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

Решение 2

не используют Скрытого помощника. Кажется, что Вам действительно не нужен он. Вместо этого Вы могли сделать это:

<input type="hidden" name="the-name" 
  value="<%= Html.AttributeEncode(Model.Value) %>" />

, Конечно, как я думаю об этом больше, изменяя значение на основе обратной передачи, имеет смысл для Текстовых полей, но имеет меньше смысла для скрытых исходных данных. Мы не можем изменить это для v1.0, но я рассмотрю это для v2. Но мы должны продумать тщательно последствия такого изменения.

36
ответ дан 2 revs, 2 users 75% 27 November 2019 в 00:35
поделиться

Это было бы ожидаемым behavoir - MVC не использует состояние отображения или другой позади Ваших задних приемов для передачи дополнительной информации в форме, таким образом, это понятия не имеет, какую форму Вы отправили (имя формы не является частью отправленных данных, только список пар имя/значение).

, Когда MVC представляет форму назад, это просто проверяет, чтобы видеть, существует ли отправленное значение с тем же именем - снова, это не имеет никакого способа знать, какая форма именованное значение прибыло из, или даже каким управлением это было (используете ли Вы радио, текст или скрытый, это - все просто name=value когда его отправленный через HTTP).

5
ответ дан David 27 November 2019 в 00:35
поделиться

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

 Общедоступная общая функция скрыта ( 

 ByVal htmlHelper как System.Web.Mvc.HtmlHelper, 
 Имя ByVal как строка, значение ByVal как объект) 
Как строка 

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

Обзор: возвращает скрытый входной тег.

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

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

В моем приложении у меня есть форма, в которой: html.Hidden ("remote", True) отображается как

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

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

1
ответ дан 27 November 2019 в 00:35
поделиться

Я столкнулся с той же проблемой. Помощники HTML, такие как TextBox () с приоритетом для переданных значений, по-видимому, ведут себя прямо противоположно тому, что я сделал из Документации , где говорится:

Значение элемента ввода текста. Если это значение - пустая ссылка (В Visual Basic ничего нет), значение элемента извлекается из объект ViewDataDictionary. Если там нет значения, это значение полученный из объекта ModelStateDictionary.

Я прочитал, что используется значение, если оно передано. Но чтение источника TextBox ():

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);

, похоже, указывает на то, что фактический порядок прямо противоположен документированному. Фактический порядок выглядит следующим образом:

  1. ModelState
  2. ViewData
  3. Значение (передается в TextBox () вызывающим)
6
ответ дан 27 November 2019 в 00:35
поделиться

Пример воспроизведения «проблемы дизайна» и возможное решение. Однако нет никакого обходного пути для 3-х часов, потерянных в попытках найти «ошибку» ... Обратите внимание, что это «дизайн» все еще находится в ASP.NET MVC 2.0 RTM.

    [HttpPost]
    public ActionResult ProductEditSave(ProductModel product)
    {
        //Change product name from what was submitted by the form
        product.Name += " (user set)";

        //MVC Helpers are using, to find the value to render, these dictionnaries in this order: 
        //1) ModelState 2) ViewData 3) Value
        //This means MVC won't render values modified by this code, but the original values posted to this controller.
        //Here we simply don't want to render ModelState values.
        ModelState.Clear(); //Possible workaround which works. You loose binding errors information though...  => Instead you could replace HtmlHelpers by HTML input for the specific inputs you are modifying in this method.
        return View("ProductEditForm", product);
    }

Если ваша форма изначально содержит это: <% = Html.HiddenFor (m => m.ProductId)%>

Если исходное значение «Имя» (при визуализации формы) - «пустышка ", после отправки формы вы ожидаете увидеть" пустышку (пользовательский набор) ". Без ModelState.Clear () вы все равно увидите" пустышку "!!!!! !

Правильный обходной путь:

<input type="hidden" name="Name" value="<%= Html.AttributeEncode(Model.Name) %>" />

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

3
ответ дан 27 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

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