2010-01-14 5 views
1

내 사용자 개체에 대한 편집 /보기가 있지만 일부 필드 만 편집 가능하게하고 싶습니다.mvc modelbinding

나는 User 객체에 바인딩하기 위해 뷰를 설정했고, 편집 할 수있는 몇 개의 필드에는 Html.EditorFor()를 사용하고있다.

나는 포스트에 내 사용자 개체에서 발견 : I가() 컨트롤을 .EditorFor를 제공하는 필드 만이 실제로 어떤 데이터가
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditUser(Mynamespace.User user) 
{ } 

.
내가 편집 할 수 싶지 않은 필드 중 하나에 대해 Html.Hidden (Model.ID)을 사용했지만 모델 바인딩에서 생성 된 새 사용자 개체에서 null입니다.

그래서 내 질문 - 필드 몇 개만 편집 가능해야하는 곳에 어떻게 바인딩합니까?

감사합니다.

답변

1

숨겨진 필드에 강력한 유형의 도우미를 사용하고 있거나 입력 한 것과 정확히 같습니다. 정확히 입력했으면 숨겨진 필드의 이름은 모델의 속성 이름이 아닌 id 값입니다 (ID). (강력한 형식의 도우미를 사용하는 경우)

<%= Html.HiddenFor(m => m.ID) %> 
+0

이 기술을 사용하면 다른 사람이 렌더링 된 다른 레코드를 쉽게 편집 할 수 있습니다. 이것은 응용 프로그램에서 괜찮을 수도 있지만 공개 응용 프로그램에서는 매우 위험합니다. –

+0

예.로그인 한 사용자가 문제의 특정 레코드를 수정할 수 있도록하려면 보안이 필요합니다. 현재 사용자가 적절한 역할에 있는지 또는 업데이트중인 데이터의 소유자인지를 확인하기 위해 업데이트 방법에 사용자 지정 특성을 사용합니다. – tvanfosson

+0

html.Hidden 헬퍼와 함께 사용할 수 없습니다 (m => m.ID). (이것은 EditorFor() 필드의 모델 데이터에 액세스하는 방법입니다. 그 이유는 무엇입니까? –

1

그것은 당신이 아마에 특정한보기 모델을 사용하는 방법에 대한 생각을 시작하려면 같은 소리

<%= Html.Hidden("ID") %> 

나 : 당신은 그것을 변경할 수 있습니다 당신이 다루고있는 양식/입력. 그러나 단기적으로 ....

당신은 대신 FormCollection 매개 변수에 결합하여 수동으로 값을 복사, 또는 수 ...

당신은이 기존의 사용자 개체를 채 웁니다 TryUpdateModel 방법을 사용할 수 있습니다 새로운 데이터. 악의적 인 사용자가 모델에 실제 속성에 매핑 가짜 폼 값을 전송하는 것은 여전히 ​​가능 http://msdn.microsoft.com/en-us/library/dd470756.aspx

때문에,이에 대한 보호 (직원과 같은 자신의 급여 속성을 변경 : 여기

TryUpdateModel에 대한 설명서입니다 간단한 폼 해킹으로) 허용하는 화이트리스트 속성을 포함하는 인터페이스를 소개 할 수 있습니다. 이이 작업을 수행하는 방법에 대한 좋은 자원이다

public interface IUserEditableFields 
{ 
    string Username {get;set;} 
    string Email {get;set;} 
} 

//... in the controller action 

if(TryUpdateModel<IUserEditableFields>(user)) { 
    //validation passed 
    //only Username and Email were editable 
} 

: 여기

은 예입니다 http://css.dzone.com/news/aspnet-mvc-think-before-you-bi

1

벤의 대답은 크게 뷰 모델이 더 적합 할 수 있다는 점에서, 정확한, 그리고 짧은 그, TryUpdateModel 사용할 수 있습니다. 그러나이 경우 도메인 객체에 새 인터페이스를 구현하도록 요구하지 않고 과부하 TryUpdateModel<T>(T, string[])을 사용하면 문자열 배열의 업데이트 할 수있는 속성을 이름별로 허용 목록에 추가 할 수 있습니다.