Get a template error when I try to do this?

Refresh

December 2018

Views

44.9k time

18

I am using asp.net mvc 3 and I keep getting this error and I don't understand it since I am not using a template.

I have this in my partial view

@model ViewModels.FormViewModel

    <div="tabs-1">
        @Html.TextBoxFor(x => x.Due.ToShortDateString())
    </div>

in my viewmodel

public class FormViewModel
    {
        public DateTime Due { get; set; }


        public FormViewModel()
        {
            DueDate = DateTime.UtcNow;         
        }
    }

and I get this error

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

6 answers

0

Вы вводящие в заблуждение заявления, передавая метод в параметре textboxforвместо передачи выражения.

Ты имел :

@Html.TextBoxFor(x => x.Due.ToShortDateString())

Храните результат в переменной, а затем использовать выражение. Попробуй это

var shortDate = Model.Due.ToShortDateString();
@Html.TextBoxFor(x => shortDate )
51

Должно быть так:

@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())
6

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

// 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)
5

Вы получаете ошибку , потому что .TextBoxFor()HTML хелпер использует встроенный шаблон (текстовое поле для ввода строки), и вы даете ему лямбда - выражения , что это слишком сложно (т.е. не принадлежит множеству типов , перечисленных в сообщение).

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

@Html.TextBoxFor(m => m.Due)

Если вы не довольны тем, как пользователи просят изменить дату, поставить частичное представление под названием «DateTime.cshtml» в ~ / Views / Shared / EditorTemplates где вы строите редактор, так что работает так, как вы хотите.

0

Вместо добавления формата в модели использования @value Аннотации, как показано ниже

@ Html.TextBoxFor (х => x.Due новый {@ Значение = Model.Due.ToShortDateString ()})

5

Если вы используете MVC и есть код элемента инлайн, попробуйте установить параметр , как это -

@{
string parameterValue = DateTime.Parse(@item.Value).ToShortDateString();

}

@Html.DisplayFor(model => parameterValue)