OData 패치로 asp.net mvc 웹 API 부분 업데이트

303

HttpPatch를 사용하여 개체를 부분적으로 업데이트하고 있습니다. 이 작업을 수행하기 위해 OData의 Delta 및 Patch 메서드를 사용하고 있습니다 (여기에 언급 : Web API로 부분 업데이트를 수행하는 현재 권장되는 방법은 무엇입니까? ). 모든 것이 잘 작동하는 것 같지만 매퍼가 대소 문자를 구분한다는 것을 알았습니다. 다음 개체가 전달되면 속성이 업데이트 된 값을 가져옵니다.

{
  "Title" : "New title goes here",
  "ShortDescription" : "New text goes here"
}

그러나 소문자 또는 낙타 케이스 속성을 사용하여 동일한 개체를 전달하면 Patch가 작동하지 않습니다. 새 값이 통과하지 않으므로 역 직렬화 및 속성 매핑에 문제가있는 것 같습니다. 즉, "shortDescription"에서 "ShortDescription"으로 ".

패치를 사용하여 대소 문자 구분을 무시하는 구성 섹션이 있습니까?

참고 :

출력에서 다음 포맷터를 사용하는 카멜 케이스 속성 (REST 모범 사례에 따라)이 있습니다.

//formatting
JsonSerializerSettings jss = new JsonSerializerSettings();
jss.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.SerializerSettings = jss;

//sample output
{
  "title" : "First",
  "shortDescription" : "First post!"
}

그러나 내 모델 클래스는 다음과 같은 C # /. NET 형식 지정 규칙입니다.

public class Entry {
  public string Title { get; set;}
  public string ShortDescription { get; set;}
  //rest of the code omitted
}
rik.vanmechelen

짧은 대답, 아니요 (내가 아는 한) 대소 문자 구분을 취소하는 구성 옵션이 없습니다.

긴 대답 : 저는 오늘 당신과 같은 문제를 겪었고 이것이 제가 그 문제를 해결 한 방법입니다.
대소 문자를 구분해야한다는 사실이 엄청나게 짜증이 났고, 그래서 우리가 남용하는 거대한 라이브러리이기 때문에 전체 oData 부분을 없애기로 결정했습니다 ....

이 구현의 예는 내 github github 에서 찾을 수 있습니다.

나는 실제로 우리가 부족한 근육이기 때문에 나만의 패치 방법을 구현하기로 결정했습니다. 다음 추상 클래스를 만들었습니다.

public abstract class MyModel
{
    public void Patch(Object u)
    {
        var props = from p in this.GetType().GetProperties()
                    let attr = p.GetCustomAttribute(typeof(NotPatchableAttribute))
                    where attr == null
                    select p;
        foreach (var prop in props)
        {
            var val = prop.GetValue(this, null);
            if (val != null)
                prop.SetValue(u, val);
        }
    }
}

그런 다음 모든 모델 클래스를 * MyModel *에서 상속합니다. * let *을 사용하는 줄을 적어 둡니다. 나중에 제외하겠습니다. 이제 컨트롤러 작업에서 Delta를 제거하고 put 메소드와 마찬가지로 다시 Entry로 만들 수 있습니다. 예 :

public IHttpActionResult PatchUser(int id, Entry newEntry)

다음과 같은 방식으로 패치 방법을 계속 사용할 수 있습니다.

var entry = dbContext.Entries.SingleOrDefault(p => p.ID == id);
newEntry.Patch(entry);
dbContext.SaveChanges();

자, 다시 라인으로 돌아 가자

let attr = p.GetCustomAttribute(typeof(NotPatchableAttribute))

패치 요청으로 모든 속성을 업데이트 할 수있는 보안 위험을 발견했습니다. 예를 들어, 이제 패치를 통해 ID를 변경할 수 있도록 할 수 있습니다. 내 속성을 장식 할 사용자 지정 속성을 만들었습니다. NotPatchable 속성 :

public class NotPatchableAttribute : Attribute {}

다른 속성과 마찬가지로 사용할 수 있습니다.

public class User : MyModel
{
    [NotPatchable]
    public int ID { get; set; }
    [NotPatchable]
    public bool Deleted { get; set; }
    public string FirstName { get; set; }
}

이 호출에서 Deleted 및 ID 속성은 patch 메서드를 통해 변경할 수 없습니다.

이 문제가 해결되기를 바랍니다. 질문이 있으시면 주저하지 말고 의견을 남겨주세요.

새 mvc 5 프로젝트에서 소품을 검사하는 스크린 샷을 추가했습니다. 보시다시피 결과보기는 제목 및 간단한 설명으로 채워집니다.

소품 검사 예

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

asp.net odata 웹 API $ select 관련 항목에 대한 실패

분류에서Dev

asp.net MVc 4보기의 부분보기를 부분보기로 업데이트

분류에서Dev

Odata asp.net 코어 2.2 웹 API 페이지 매김

분류에서Dev

ASP.net MVC 웹 API + Android

분류에서Dev

업데이트 된 부분보기 데이터를 div로 설정할 수 없습니다. ASP.NET MVC

분류에서Dev

asp.net 웹 API에서 데이터를 사용하기위한 asp.net MVC 디자인 패턴

분류에서Dev

asp.net 웹 API에 대한 웹 사이트 호출-이미지 업로드 실패

분류에서Dev

동일한 프로젝트의 asp.net mvc 컨트롤러에서 asp.net 웹 API에서 데이터를 가져 오는 방법

분류에서Dev

Asp.net 웹 API 2 웹 클라이언트와 웹 서버 개발 분리

분류에서Dev

컨트롤러 작업을 호출하지 않는 경로 별 ASP.NET MVC 웹 API 메시지 처리기

분류에서Dev

Asp.Net Mvc 웹 API 라우팅 404

분류에서Dev

Asp.net 웹 API odata 하위 문자열의 null 문제

분류에서Dev

asp.net : 새로 고침없이 페이지 내용 업데이트 (부분 페이지 업데이트)

분류에서Dev

ASP.NET MVC 웹 사이트 : 여기로 이동 된 개체

분류에서Dev

최고의 ASP.NET MVC 비동기 업데이트 패턴

분류에서Dev

모든보기를 업데이트하지 않고 ASP.NET MVC의 다른 부분보기에서 부분보기 업데이트

분류에서Dev

IronPython으로 ASP.Net MVC 웹 사이트 확장

분류에서Dev

mvc4 웹 사이트를 asp.net 서버로 전송

분류에서Dev

900 개 이상의 데이터 세트 행을 웹 API로 전송하여 시간이 초과되었습니다. Asp.net MVC 사용

분류에서Dev

ASP MVC 4 + 웹 API

분류에서Dev

OData asp.net 웹 API에서 사용자 등록 작업을 만드는 방법

분류에서Dev

ASP.NET MVC 웹앱의 ID / 인증 부분을 클래스 라이브러리로 이동하려면 어떻게해야합니까?

분류에서Dev

게시는 부분 [C # / MVC / ASP.Net]을 업데이트하지 않습니다.

분류에서Dev

ASP.NET MVC 데이터가 사용 된 부분보기에서 컨트롤러로 오지 않습니다.

분류에서Dev

Asp.net MVC는 ajax를 사용하여 15 초 후에 페이지를 다시로드하지 않고 웹 페이지를 업데이트합니다.

분류에서Dev

웹 API 컨트롤러를 호출하는 Asp.net MVC 프로젝트의 Angularjs

분류에서Dev

WebAPI C # ASP.Net MVC를 통해 외부 웹 사이트에서 데이터 추출

분류에서Dev

C # MVC 5 Razor : Ajax로 부분보기 업데이트 실패

분류에서Dev

주어진 경로에 대해 asp.net mvc 웹 API 도움말 페이지가 채워지지 않음

Related 관련 기사

  1. 1

    asp.net odata 웹 API $ select 관련 항목에 대한 실패

  2. 2

    asp.net MVc 4보기의 부분보기를 부분보기로 업데이트

  3. 3

    Odata asp.net 코어 2.2 웹 API 페이지 매김

  4. 4

    ASP.net MVC 웹 API + Android

  5. 5

    업데이트 된 부분보기 데이터를 div로 설정할 수 없습니다. ASP.NET MVC

  6. 6

    asp.net 웹 API에서 데이터를 사용하기위한 asp.net MVC 디자인 패턴

  7. 7

    asp.net 웹 API에 대한 웹 사이트 호출-이미지 업로드 실패

  8. 8

    동일한 프로젝트의 asp.net mvc 컨트롤러에서 asp.net 웹 API에서 데이터를 가져 오는 방법

  9. 9

    Asp.net 웹 API 2 웹 클라이언트와 웹 서버 개발 분리

  10. 10

    컨트롤러 작업을 호출하지 않는 경로 별 ASP.NET MVC 웹 API 메시지 처리기

  11. 11

    Asp.Net Mvc 웹 API 라우팅 404

  12. 12

    Asp.net 웹 API odata 하위 문자열의 null 문제

  13. 13

    asp.net : 새로 고침없이 페이지 내용 업데이트 (부분 페이지 업데이트)

  14. 14

    ASP.NET MVC 웹 사이트 : 여기로 이동 된 개체

  15. 15

    최고의 ASP.NET MVC 비동기 업데이트 패턴

  16. 16

    모든보기를 업데이트하지 않고 ASP.NET MVC의 다른 부분보기에서 부분보기 업데이트

  17. 17

    IronPython으로 ASP.Net MVC 웹 사이트 확장

  18. 18

    mvc4 웹 사이트를 asp.net 서버로 전송

  19. 19

    900 개 이상의 데이터 세트 행을 웹 API로 전송하여 시간이 초과되었습니다. Asp.net MVC 사용

  20. 20

    ASP MVC 4 + 웹 API

  21. 21

    OData asp.net 웹 API에서 사용자 등록 작업을 만드는 방법

  22. 22

    ASP.NET MVC 웹앱의 ID / 인증 부분을 클래스 라이브러리로 이동하려면 어떻게해야합니까?

  23. 23

    게시는 부분 [C # / MVC / ASP.Net]을 업데이트하지 않습니다.

  24. 24

    ASP.NET MVC 데이터가 사용 된 부분보기에서 컨트롤러로 오지 않습니다.

  25. 25

    Asp.net MVC는 ajax를 사용하여 15 초 후에 페이지를 다시로드하지 않고 웹 페이지를 업데이트합니다.

  26. 26

    웹 API 컨트롤러를 호출하는 Asp.net MVC 프로젝트의 Angularjs

  27. 27

    WebAPI C # ASP.Net MVC를 통해 외부 웹 사이트에서 데이터 추출

  28. 28

    C # MVC 5 Razor : Ajax로 부분보기 업데이트 실패

  29. 29

    주어진 경로에 대해 asp.net mvc 웹 API 도움말 페이지가 채워지지 않음

뜨겁다태그

보관