2011-02-03 5 views
18

asp.net mvc 3을 사용하고 있는데이 오류가 계속 발생하고 템플릿을 사용하지 않아서 이해가되지 않습니다.시도 할 때 템플릿 오류가 발생합니까?

내 ViewModel에

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


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

내 부분보기

@model ViewModels.FormViewModel 

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

이 있고이 오류를

전용 필드 액세스와 함께 사용할 수 있습니다

템플릿 속성을 가져 액세스, 1 차원 배열 인덱스 또는 싱글 전자 매개 변수 사용자 지정 인덱서 식입니다. 설명 : 처리되지 않은 예외가 현재 웹 요청의 실행 중 중에 발생했습니다. 오류에 대한 정보와 이 코드에서 비롯된 위치에 대한 스택 추적을 검토하십시오.

예외 정보 : System.InvalidOperationException : 템플릿은 전용 필드 액세스, 속성 액세스, 단일 차원 배열 인덱스, 또는 단일 매개 변수를 사용자 정의 인덱서 표현을 사용할 수 있습니다.

답변

51

은 다음과 같이해야합니다 다음

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
public DateTime Due { get; set; } 

과 : 당신이 정말로 원하는 경우의

@Html.EditorFor(x => x.Due) 

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

그리고 당신이 날짜에 대한 몇 가지 형식을 원하는 경우 이 .ToShortDateString() 방법을 사용하려면 비 강하게 사용해야합니다. PED 도우미는 (분명히 그게 내가에 추천 할 것입니다 뭔가) :

@Html.TextBox("Due", Model.Due.ToShortDateString()) 
+1

@Darin Dimitrov - Ok 나는 어쨌든 문자열로 렌더링되기 때문에 나쁜 예제를 사용했다고 생각합니다. "ToShortDateString()"을 사용하려는 이유는 무엇입니까? – chobo2

+0

@ chobo2, 당신은'DisplayFormat' 속성과'Html.EditorFor' 헬퍼를 사용하여 포맷을 지정할 수 있습니다. –

+0

@Darin Dimitrov - 그래서 내가 사용하고있는 것은 템플릿으로 간주됩니까? 그래서 도우미를위한 템플릿 중 하나는 템플릿을 변경하는 것입니다. Tomas Lycken이 말한 것처럼 편집하거나 데이터 주석을 사용하여 모양을 수정해야합니다. – chobo2

5

.TextBoxFor() HTML 헬퍼가 내장 템플릿 (문자열 입력을위한 텍스트 상자)를 사용하고 있기 때문에 당신은 오류가있어, 당신은주는거야 그것은 너무 복잡한 람다 표현식 (ie 메시지에 나열된 유형 집합에 속하지 않습니다).

문제를 해결하려면 편집 할 속성 유형을 string으로 변경하십시오. MVC가 기본 문자열 템플릿을 사용하거나 MVC가 기본 datetime 템플릿을 대신 사용하도록하십시오. 나는 후자를 권 해드립니다 :

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

하면 사용자가 날짜를 수정하도록 요청하는 방식에 만족하지 않은 경우, ~/조회/공유/EditorTemplates에서 "DateTime.cshtml"라는 부분 뷰를 넣어 편집기를 빌드하면 원하는대로 작동합니다.

+0

@ Tomas Lycken - 면도기를 사용하기 전에 문제가 있다는 것을 기억하지 못하는이 새로운 것입니까? 내 자신을 만들면 모든 날짜에 이걸 얻을 수 있을까요? 내가 싫어하는 사람조차? 예를 들어, 날짜 중 하나만 ToShortDateString()을 갖기를 원하지만 다른 모든 것들이 기본값처럼 렌더링되도록하려면이 작업을 수행 할 수 있습니까? – chobo2

+0

@ Tomas Lycken - 내가 한 일은 너무 복잡했다. 먼저 문자열로 변환하지 않고 텍스트 상자에 넣으시겠습니까? 텍스트 상자가 처리 할 수있는 것에 대한 자세한 내용은 어디에서 읽을 수 있습니까? 그냥 이상하게 보입니다. – chobo2

+0

@ chobo2 : 문제는 렌더링하는 것이 매우 복잡하지 않다는 것입니다. ViewModel 속성의 이름 (입력 필드의'name' 속성에 사용됩니다)은 오류 메시지에 나열된 것보다 더 깊은 명령문을 허용하면 훨씬 더 복잡해집니다. 날짜 출력에 영향을 주려면'[DisplayFormat]'속성 (또는 사용 가능한 다른 속성 중 하나)을 사용하거나 자신 만의 템플릿을 만드십시오. –

5

당신이 MVC를 사용하여 인라인 코드 요소가있는 경우,이 같은 매개 변수를 설정하려고 - 강력한 형식을 유지하면서,이를 달성 할 수 과부하가있다

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

} 

@Html.DisplayFor(model => parameterValue) 
+0

DateTime.Parse가 필요하지 않았습니다. 단지 문자열입니다. datevalue = item.LastUpdate.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) 
0

당신은 textboxfor의 매개 변수에 방법을 전달하는 대신에 식을 전달하여 응용 프로그램을 오해의 소지가있다. 변수에

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

스토어 당신의 결과를 다음 식을 사용

당신은 있었다. 대신 모델을 다음과 같이 사용 @Value 주석의 형식을 추가하는이

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

을 시도

@ Html.TextBoxFor (X => x.Due 새로운 {@ 값 = Model.Due.ToShortDateString()})

관련 문제