Подтвердить что ты не робот

Asp.net MVC: отключить TextBox

У меня есть Html.TextBox(), и мне нужно отключить его в определенных условиях. С TextArea он выглядит следующим образом:

<%=primaryLang ? Html.TextArea("e.location", new { rows = 2, cols = 60 }) : Html.TextArea("e.location", new { rows = 2, cols = 60, disabled = "true" })%>

Но с помощью TextBox это невозможно:

    <%=primaryLang ? 
      Html.TextBox("e.startDate") : 
        Html.TextBox("e.startDate", new { disabled = "true"})%>

Он выдает {disabled = true} значение. Это связано с тем, что единственная функция, которая позволит вам передать HtmlAttributes, потребует также передачи модели. Это представление строго типизировано, и модель автоматически заполняется.

Если я пройду так:

Html.TextBox("e.startDate", Model.e.startDate, new { disabled = "true"})

или вот так:

Html.TextBox("e.startDate", null, new { disabled = "true"})

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

Если я оставлю это желание, вот так:

Html.TextBox("e.startDate") 

он будет работать правильно, как для POST, так и для GET...

Почему? Любые способы достижения?

Спасибо!:)


Благодаря ответам ниже я решил это следующим образом:

<%=primaryLang ? 
        Html.TextBox("e.startDate") : 
          Html.Hidden("e.startDate") + Html.TextBox("e.startDate", null, new { disabled = "true"})%>
4b9b3361

Ответ 1

Отключенные элементы HTML не возвращаются на сервер. Вот почему вы получаете исключение NullReferenceException, когда вам удается отключить ваш элемент.

Я не уверен, чего вы пытаетесь достичь, но если вы не позволяете e.startDate быть редактируемым, тогда вам не нужно, чтобы он был отправлен назад, поскольку вы уже должны знать значение. Таким образом, у вас есть два варианта.

  • Покажите e.startDate, как вы, но просто установите значение e.startDate в методе post по умолчанию или полностью игнорируйте его.
  • Если вам нужно вернуть значение, тогда отобразите e.startDate как метку, затем добавьте скрытое поле, содержащее e.startDate, для вашего опубликованного обратного значения.

Предупреждение. Только потому, что элемент отключен, это не означает, что кто-то не может редактировать значение и отправлять его обратно. Это просто рекомендация. Отобразите поле в браузере. Если ваш POST-код действительно принимает значение e.startDate, любой, у кого есть доступ, может редактировать это поле с помощью инструментов разработки.

Ответ 2

В POST свойство "Model" или "e", вероятно, имеет значение null.

Вы можете попробовать следующее:

<%if (Model != null && Model.e != null) { %>
<%=Html.TextBox("e.StartDate", Model.e.StartDate, primaryLang ? null :  new { disabled = "disabled" })%>
<%}%>