Получите ошибку шаблона, когда я попытаюсь это сделать?
Я использую asp.net mvc 3, и я продолжаю получать эту ошибку, и я не понимаю ее, так как я не использую шаблон.
У меня это в моем частичном представлении
@model ViewModels.FormViewModel
<div="tabs-1">
@Html.TextBoxFor(x => x.Due.ToShortDateString())
</div>
в моей модели просмотра
public class FormViewModel
{
public DateTime Due { get; set; }
public FormViewModel()
{
DueDate = DateTime.UtcNow;
}
}
и я получаю эту ошибку
Шаблоны могут использоваться только с полем доступ, доступ к собственности, индекс одномерного массива или однопараметрический пользовательский индекс выражения. Описание: необработанный исключение произошло во время выполнение текущего веб-запроса. Просмотрите трассировку стека информацию об ошибке и он возник из кода.
Сведения об исключении: System.InvalidOperationException: Шаблоны могут использоваться только с полем доступ, доступ к собственности, индекс одномерного массива или однопараметрический пользовательский индекс выражения.
Ответы
Ответ 1
Должно быть так:
@Html.TextBoxFor(x => x.Due)
И если вам нужен какой-то формат для этой даты:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime Due { get; set; }
а затем:
@Html.EditorFor(x => x.Due)
если вы действительно хотите использовать этот метод .ToShortDateString()
, вам нужно использовать не строго типизированный помощник (очевидно, что-то, что я рекомендовал бы против):
@Html.TextBox("Due", Model.Due.ToShortDateString())
Ответ 2
Существует перегрузка, которая может помочь в достижении этого, сохраняя при этом ее строго типизированное значение.
// Specify that you're providing the format argument (string)
@Html.TextBoxFor(x => x.Due, format: Model.Due.ToShortDateString())
// Or use the overload with format and html options, where null is the htmloptions
@Html.TextBoxFor(x => x.Due, Model.Due.ToShortDateString(), null)
Ответ 3
Вы получаете ошибку, потому что хелпер .TextBoxFor()
html использует встроенный шаблон (текстовое поле для ввода строки), и вы даете ему слишком сложное лямбда-выражение (т.е. не относится к набор типов, перечисленных в сообщении).
Чтобы решить проблему, измените тип свойства, которое вы хотите изменить, на string
, поэтому MVC может использовать шаблон строки по умолчанию или использовать MVC вместо стандартного шаблона даты и времени. Я бы рекомендовал последнее:
@Html.TextBoxFor(m => m.Due)
Если вы недовольны тем, как ваши пользователи просят изменить дату, добавьте частичный вид с именем DateTime.cshtml в ~/Views/Shared/EditorTemplates, где вы создаете редактор, чтобы он работал так, как вы хотите.
Ответ 4
Если вы используете MVC и имеете встроенный элемент кода, попробуйте установить такой параметр -
@{
string parameterValue = DateTime.Parse(@item.Value).ToShortDateString();
}
@Html.DisplayFor(model => parameterValue)
Ответ 5
Вы вводите в заблуждение приложение, передавая метод в параметре textboxfor
вместо передачи выражения.
У вас было:
@Html.TextBoxFor(x => x.Due.ToShortDateString())
Сохраните результат в переменной и затем используйте выражение. Попробуйте это
var shortDate = Model.Due.ToShortDateString();
@Html.TextBoxFor(x => shortDate )
Ответ 6
Вместо добавления формата в модели Используйте аннотации @Value, как показано ниже
@Html.TextBoxFor(x = > x.Due new {@Value = Model.Due.ToShortDateString()})