Атрибуты Html ломают шаблон редактора, отображая его только для чтения

В настоящее время я работаю над проектом ASP.NET MVC 3. Я сделал собственный шаблон редактора для отображения процентов. Вот код, который у меня есть до сих пор.

public class MyClass
{
   // The datatype can be decimal or double
   [Percentage]
   public double MyPercentage { get; set; }
}

Атрибут [Percentage] — это обычный атрибут UI Hint, в котором используется следующий код:

    @model Object
    @{
        string fieldName = ViewData.TemplateInfo.HtmlFieldPrefix;
    }

    <div style="height: 24px;">
        <div style="float: left;">
          @Html.TextBox("", String.Format("{0:0.00}", Model), new
          {
              id = "txt" + fieldName,
              @Class = "magnaNumericTextBox",
              type = "magnaNumericType",
              style = "width:230px"
          })
          &nbsp;%
        </div>
        <div style="float: left;">
            <ul style="height: 24px; list-style: none; padding: 0px; margin: 0px; line-height: none;">
                <li style="line-height: normal"><a id="btn@(fieldName)Up" class="magnaNumericButton button small">
                    ˄</a> </li>
                <li style="line-height: normal"><a id="btn@(fieldName)Down" class="magnaNumericButton button small">
                    ˅</a> </li>
            </ul>
        </div>
    </div>
    <script type="text/javascript">

        $("#btn@(fieldName)Up").click(function ()
        {
            ChangeNumericUpDownValue($('#txt@(fieldName)'), 1);
            return false;
        });

        $("#btn@(fieldName)Down").click(function ()
        {
            ChangeNumericUpDownValue($('#txt@(fieldName)'), -1);
            return false;
        });

        $('#txt@(fieldName)').keypress(function (e)
        {
            NumericUpDownKeyPress($(this), e);
            return false;
        });

    </script>

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

Теперь проблема заключается в том, что текстовое поле в шаблоне редактора не позволяет пользователю вводить свое собственное значение (что делает его доступным только для чтения, хотя в отображаемом html нет атрибута только для чтения), только с помощью цифровых кнопок вверх вниз. Я определил, что если я удалю атрибуты html из помощника текстового поля следующим образом:

  @Html.TextBox("", String.Format("{0:0.00}", Model))

Что пользователь может еще раз добавить значение, введя его в текстовое поле. Что это может быть? Любая помощь или совет будут оценены.

Спасибо


person jacqijvv    schedule 07.03.2012    source источник
comment
То, как вы генерируете идентификатор для поля, неверно. ViewData.TemplateInfo.HtmlFieldPrefix – это ПРЕФИКС поля (например, [Car.Window.‹-- HtmlPrefix]Color). Если вам нужен идентификатор или имя, вы должны использовать @Html.NameForModel и @Html.IdForModel в шаблоне.   -  person Ivan Zlatev    schedule 07.03.2012


Ответы (1)


Причина, по которой это происходит, заключается в том, что вы возвращаете false из события keypress javascript, на которое вы подписались:

$('#txt@(fieldName)').keypress(function (e) {
    NumericUpDownKeyPress($(this), e);
    return false; // <- here you are blocking all keys
});

Это означает, что независимо от того, какую клавишу пользователь набирает внутри текстового поля, вы отменяете ее. И причина, по которой это работает, когда вы удаляете атрибуты, заключается в том, что ваше текстовое поле больше не имеет правильного идентификатора, а ваш селектор jquery не соответствует ни одному элементу, и поэтому он ничего не делает, позволяя пользователю вводить все, что ему нравится в поле текстовое окно. Поэтому, если вы хотите разрешить ему печатать, вы не должны возвращать false из обработчика .keypress(). Или, по крайней мере, не систематически -> вы можете вернуть true, например, если он вводит число, которое должно быть единственным разрешенным символом в этом текстовом поле.

person Darin Dimitrov    schedule 07.03.2012
comment
Бесконечно благодарен. Я бы никогда не догадался об этом, но теперь все это имеет смысл. Я не знаю, почему я поставил return false в первую очередь. - person jacqijvv; 07.03.2012