2012-08-02 3 views
0

시나리오 : password, address, preference, roles :ApiController에 대해 여러 POST 동작을 수행 할 수 있습니까?

User 클래스는 속성의 여러 그룹이 있습니다.

우리는 다른 아약스 (2) 사용자 프로파일, 사용자가에서 (3) 역할은 (1) 사용자 암호를 업데이트 호출해야합니다.

모든 자습서 및 예제는 단지를 업데이트 한 POST 액션을 보여줍니다 전체 사용자 클래스. 제 질문은 클래스의 일부만 업데이트 할 수있는 방법입니다. 사용자 암호를 업데이트 할 때

예를 들어, 우리는 :

  1. 표시 텍스트 상자는 사용자 입력에서 새 암호를 수집합니다.
  2. WebAPI POST 조치에 userId와 함께 새 암호 (예 : {id = 3, newPassword = xxxxx}) 만 POST하는 Ajax 호출을 작성하십시오.
  3. 이 작업을 수행하면 사용자의 암호 만 업데이트됩니다.

하나 개의 솔루션 : (가장 쉬운 생각할 수)

  1. 전화 사용자 ID와 GET 동작이 사용자
  2. 업데이트의 값으로 사용자 데이터에 비밀번호에 대한 모든 데이터를 검색 할 웹 사용자 입력에서 가져옴
  3. User 클래스의 모든 속성을 포함하는 업데이트 된 데이터로 POST 작업을 호출하십시오.
  4. POST 작업은 암호 만 변경된다는 사실을 모른 채 전체 데이터를 업데이트합니다.

이점 : ApiController에 대해 하나의 POST 조치가 필요합니다.

단점 : 우리는 Ajax를 두 번해야합니다.

ApiControllerPOST 개의 액션이 여러 개있을 수 있습니까? 예 : PostPassword(userId, password), PostProfile(userId, profile)PostRoles(userId, roles).

이렇게하면 암호를 ApiController으로 보내려면 PostPassword이라고 만 부릅니다. 클라이언트 측에서는 오직 하나의 Ajax 호출 만있을 것입니다. 업데이트를 수행 할 서버에 있습니다. 이익은 물론 인터넷을 통해 전송되는 축소 된 데이터입니다.

가능한 경우 모든 POST 번의 호출을 ApiController의 해당 작업으로 안내하는 올바른 방법은 무엇입니까?

우리를 도와주세요. 다들 감사 해요.

답변

2

대부분의 경우, 불필요한 사후 조치가있을 것으로 생각됩니다. 전형적인 경우는 사용자가 사용자를 편집해야하는 경우입니다. 따라서 편집 폼에 표시하려면 먼저 사용자 데이터를로드해야합니다. 편집 후 소비자는 저장 버튼을 클릭하여 데이터를 제출하고 API 컨트롤러에서 POST 동작을 호출 할 수 있습니다.

사례가 다른 경우 값 유형에 대해 nullable 속성이 있어야하며 컨트롤러에서 확인해야하는 논리는 속성이 null 인 경우이 속성을 데이터베이스로 업데이트해서는 안됩니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 편집 양식에 대한 모든 사용자 데이터를로드 할 필요는 없습니다. 암호를 업데이트해야하는 경우 입력을 허용하는 텍스트 상자 만 표시됩니다. uerId와 새 암호가있는 json 만 있으면 충분합니다. 따라서 전체 사용자 데이터의 일부를 POST하고 부분 업데이트를 얻으려면 어떻게해야합니까? – Blaise

+0

귀하의 경우, 당신은 단지 서버에 암호를 다시 게시, 사용자의 다른 속성은 null이됩니다. 각 속성이 null이 아닌지 확인하여 데이터베이스를 업데이트하는 코드는 null이 아닌 모든 속성이 업데이트됩니다. –

1

컨트롤러 작업 이름 당 하나의 게시 작업 만 가질 수 있습니다. 즉, 수행 할 수 없습니다.

// NOT VALID: 
public ActionResult UpdateUser(string newPassword) { } 
public ActionResult UpdateUser(List<string> newRoles) { } 

그러나 작업 매개 변수는 확실히 Nullable 일 수 있습니다.지정된 속성이 지정된 HTTP 요청에서 제공되지 않으면 컨트롤러의 속성 값이 null이됩니다. 각 사용자의 사용 사례 중 하나를 처리

// VALID: 
public ActionResult UpdateUser(string newPassword, List<string> newRoles) 
{ 
    if (newPassword != null) { } // It must have been supplied 
    if (newRoles != null) { } // It must have been supplied 
} 

다른 방법으로, 관련 가질 수 컨트롤러 액션, 예를 들어, UpdatePassword (...), UpdateAddress (...), ...

+0

에릭, 빠른 답장을 보내 주셔서 감사합니다. – Blaise

+0

"관련 컨트롤러"란 무엇입니까? 그것은 일반적인 MVC 컨트롤러 또는 ApiController인가? – Blaise

+0

죄송합니다. 응답에 혼란스러워하는 말을 남겨 두었습니다. 예제를 포함하여 업데이트되었습니다. –

관련 문제