2009-03-21 4 views
1

해당 유형이 byte [] 인 필드가 있습니다. 이 필드는 엔터티의 RecordVersion 속성 (데이터베이스의 타임 스탬프)을 유지합니다. 엔티티를 저장할 때 사용할 수 있도록이 필드를 어떻게 유지합니까? 내가 두 가지 일을 시도하고 지금까지 성공하지 않은ASP.NET MVC : 필드 바이트를 유지하는 방법 []

: 이것은 렌더링 "System.Byte []"

이 유형 변환 할 수없는 ModelStateError을 던졌습니다
<%= Html.Hidden("RecordVersion", Model.RecordVersion.ToString()) %> 

: 나는에 타임 스탬프를 붙이지 않을 겁니다

답변

2

모델 바인더를 만들고 등록해야합니다.

article은 수행중인 것과 매우 유사한 숨겨진 필드에서 linq 데이터베이스의 타임 스탬프를 사용하는 방법을 보여줍니다.

ModelBinders.Binders.Add(typeof(Binary), new LinqBinaryModelBinder()); 

global.asax에서 등록하십시오.

LinqBinaryModelBinder가 선물 상자에 있습니다. 사용자 바이트 []를 원하면 직접 작성해야합니다.

+0

가장 안전한 것은 byte []를 base64 문자열로 표시하는 것입니다. –

+0

ModelBinders.Binders.Add (typeof (Binary), 새로운 LinqBinaryModelBinder()); 감사합니다. –

0

/바인딩 해제 바인드가 많은 바이트 [] 필드를 좋아하지 않는 않습니다 분명히 기본 MVC의 메커니즘

ViewData["RecordVersion"] = entity.RecordVersion 

..... 양식. 내가 주변에 개체를 유지하려는 경우 서버 측 캐시하고 id를 사용하여 캐시에서 검색합니다. 그렇지 않으면 데이터베이스에서 오브젝트를 다시 검색하고 양식 데이터의 변경 사항을 적용 할 수 있습니다. 후자는 TryUpdateModel을 사용하여 내가하는 일입니다.

public ActionResult Update(int id) 
{ 
    using (var context = new DataContext()) 
    { 
     var model = context.Models.Where(m => m.ID == id).Single(); 
     if (TryUpdateModel(model)) 
     { 
      ... 
      context.SubmitChanges(); // wrapped in try/catch 
      ... 
     } 
     else 
     { 
      ... 
     } 
    } 
    return RedirectToAction("Show", new { id = id }); 
} 
+0

@ tvanfosson - 이것은 좋은 방법이며 분명히 변경 사항을 재생하는 가장 일반적인 방법이라는 것을 알고 있습니다. 나는 내 객체의 ID와 RecordVersion을 내 양식으로 유지하려고한다. 그래서 내 자신의 프레임 워크를 사용하여 변경 사항을 회신 할 수있다. 즉, 엔티티를 다시 질의 할 필요가 없다.) –

1

시도해 보셨습니까?

<%= Html.Hidden("RecordVersion", System.Text.Encoding.Unicode.GetString(Model.RecordVersion)) %> 
+0

렌더링 된 것처럼 보였다. 형식의 문자열이지만 뒤로는 바이트 [] ...로 변환되지 않습니다. –

+0

Encoding.Unicode.GetBytes를 사용하여 바이트 배열로 다시 변환 할 수있는 위치를 모델 바인딩 할 수 있습니다. – KaraT

관련 문제