생성시 "ID 필드가 필요합니다"유효성 검사 메시지; Id가 [필수]로 설정되지 않습니다.
이것은 Asp.Net MVC 2에서 스타일 만들기 작업을 사용하여 엔터티를 만들려고 할 때 발생합니다.
POCO에는 다음과 같은 속성이 있습니다.
public int Id {get;set;}
[Required]
public string Message {get; set}
엔터티를 만들 때 Id가 자동으로 설정 작성 만들기 작업에서 필요하지 않습니다.
ModelState는 "Id 필드가 필요합니다"라고 말했지만 그렇게 설정하지 않았습니다. 여기서 자동으로 진행되는 절차가 있습니까?
수정-이유 공개
문제에 대한 이유는 Paul Speranza를 통해 Brad Wilson이 다음과 같은 의견 중 하나에서 답변했습니다 (Paul을 건배합니다).
당신은 ID에 대한 가치를 제공하고 있습니다. 기본 경로 ( "{controller} / {action} / {id}")의 경로 데이터에 자주 사용되는 것은 int에 유효하지 않은 빈 페이지입니다. ID를 선택해야 할 조치 변수의 [Bind] 속성을 사용하십시오. 내 기본 경로 : new {controller = "Customer", action = "Edit", id = ""} // 매개 변수 변수
편집-모델 업데이트 기술
실제로 TryUpdateModel 및 무시 변수 배열을 사용 하여이 작업을 다시 수행 한 방식을 변경했습니다.
[HttpPost]
public ActionResult Add(Venue collection)
{
Venue venue = new Venue();
if (TryUpdateModel(venue, null, null, new[] { "Id" }))
{
_service.Add(venue);
return RedirectToAction("Index", "Manage");
}
return View(collection);
}
속성을 추가 할 수 있습니다.
[Bind(Exclude = "Id")]
클래스가 아닌 메소드의 매개 변수에 대해 작성시 제외 할 수 있으며 편집시 여전히 필수입니다.
public ActionResult Create([Bind(Exclude = "Id")] User u)
{
// will exclude for create
}
public ActionResult Edit(User u)
{
// will require for edit
}
나는 목록에 동적으로 "개체"를 추가하는 양식 으로이 문제에 부딪혔다. 따라서 사용자는 추가, 제거 또는 업데이트 할 수 있습니다. 새 항목이 생성 된 경우 제외하고 모두 잘 작동했습니다. 이런 경우 필자의 경우 Id 속성을 제외하는 것은 옵션이 아니 었습니다 . 해결은 ID를 Nullable로 만드는 것입니다 .
public int? Id { get; set; }
이렇게하면 기존 항목에는 값이 있고 새 항목에는 null이 있습니다. 좋은 물건.
훌륭한 질문과 답변, 저를 구했습니다. 그래도 추가해야합니다.
대신에
[Bind(Exclude = "Id")]
사용하는 것이 더 낫다고 생각합니다
[Bind(Include = "Prop1, Prop2, Prop3, etc")]
.. 여기서 Prop1, Prop2 및 Prop3은 작업 수준에서 바인딩하려는 유일한 속성입니다.
블랙리스트가 아닌 화이트리스트이기 때문입니다. 화이트리스트가 더 안전합니다. 이렇게하면 과다 게시 및 미달 게시 위험도 있습니다. Brad Wilson의 게시물을 참조하십시오 .
[Bind(Exclude = "Id")]
public class Hebe
{
public int Id {get;set;}
[Required]
public string Message {get; set}
}
그건 그렇고, 생성시 모델의 ID 속성을 바인딩하지 않습니다.
Id는 클라이언트에서 0으로 전송되어야합니다. 모델은 Id = 0으로 문제가 없습니다. 이것이 int의 이야기입니다. 문제는 클라이언트가 오는 값을 보지 못하거나 널과 함께 오는 것입니다. Id (또는 복잡한 개체 NestedPropertyId / NestedProperty.Id)를 숨겨진 숨겨진 입력이 값이 0으로 시작하는지 확인합니다.
<input type="hidden" id="id" value="0" />
<input type="hidden" id="eventId" value="0"/>
<input type="hidden" id="contactId" value="0"/>
또한 클라이언트 측에서 새로운 엔터티를 추가 할 폼을 추가 할 때 숨겨진 항목을 0으로 초기화해야합니다.
이것이 도움이되기를 바랍니다.
Efy
POCO와 함께 RC2를 사용하는 것과 동일한 문제가 있습니다. 속성 Id의 이름을 지정했지만 유효성 검사 특성을 입력하지 않은 경우 IsValid가 필수라고 지정했습니다. 이드가 아닌 속성의 이름을 지정하면 이런 일이 발생하지 않습니다. Id를 제외해야하는 이유는 무엇입니까?
감사합니다
추가 하시겠습니까? int로
[Key]
[HiddenInput(DisplayValue = false)]
public int? ID { get; set; }
보기를 확인하십시오. id 필드에 hiddenfield가 있으면 좋습니다. 편집 용으로 만 사용됩니다. @ Html.HiddenFor (모델 => Model.Id)
방금 새 MVC2 프로젝트를 만들고 간단한 POCO와 컨트롤러 및보기를 추가했습니다. 내가 이해 한 바에 따르면 모델 바인딩을 사용하여 개체를 만들 수 있습니다.
using System.ComponentModel.DataAnnotations;
public class SimpleObject
{
public int Id {get;set;}
[Required]
public string Message { get; set; }
}
컨트롤러에서 우리는
[HttpPost]
public ActionResult Create(SimpleObject created)
{
/// do something
}
보기에 ID 필드에 대한 편집기가 없습니까?
이것은 오류 메시지로 끝나지 않습니다. 대신 Id는 0 인 기본 (int)로 설정되어야합니다. 이것은 저에게입니다. 어떤 버전의 MVC2를 사용하고 (내가 추측하는 RC)?
오해하지 마십시오. Id가 모델 바인더에 의해 바인딩되는 것을 방지하는 것이 중요합니다. 그러면 공격자가 개체의 ID를 조작 할 수 있습니다. 그럼에도 불구하고 기본 모델 바인더는 설명하는 동작을 표시해서는 안됩니다.
제 경우에는 ID가 유형이라는 사실에서 문제가 발생했습니다 string
. int
(nullable이 아님)으로 변경하면 문제가 해결되었습니다. 이 string
유형은 잘못 설계된 데이터베이스를 리버스 엔지니어링 한 결과입니다.
내 모델에 세 개의 정수 필드가 있다는 점을 제외하면 동일한 문제가 발생했습니다. nullable int에 잘못 필요한 모든 정수 속성을 설정하여 문제를 해결했습니다.
위의 답변은 정확합니다. 모든 사람이 다른 시나리오를 따르는 방법 내 솔루션은 동일한 문제에 대해 다음과 같습니다. 만약 당신의 ID가 기본 키라면, 당신은 그것을 시작해야합니다. 즉, get 메소드에서보기 위해 모델을 전달할 때 그 전에 새 객체를 생성하는 것입니다. null 대신 ID에 0을 설정합니다.
동일한 문제가 발생하여 Create 메서드를 GET 호출하는 동안 뷰 모델의 빈 인스턴스를 뷰에 전달하여 간단히 해결할 수있었습니다.
//GET: DocumentTypes/{Controller}/Create
public ActionResult Create()
{
return View(new DocumentTypeViewModel());
}
//POST: DocumentTypes/{Controller}/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(DocumentTypeViewModel viewModel)
{
if(ModelState.IsValid) {
var result = AddDocumentType(viewModel);
if(!result.HasValidationErrors) {
return RedirectToAction("Index");
}
ModelState.Update(result);
}
return View(viewModel);
}
그리고 내 관점에서 나는
@Html.HiddenFor(m => m.ID)
이렇게하면 Bind 속성을 명시 적으로 지정할 필요가 없습니다.
나는 또한 당신과 같은 문제에 직면했고 이제 나는 이미 이것을 해결했습니다. HttpGet을 사용하면 View will 빈 모델을 반환해야합니다. 같은
[HttpGet]
public ActionResult Add()
{
//Your code here
return View(new Venue);
}
도움이 되었기를 바랍니다.
에 다음을 추가하여 AddImplicitRequiredAttributeForValueTypes
옵션을 설정하여이 암시 적 유효성 검사를 비활성화 할 수 있습니다 .DataAnnotationsModelValidatorProvider
Application_Start
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
추가 읽기 :
'ProgramingTip' 카테고리의 다른 글
DropDownList의 ListItems 속성이 포스트 백에서 검증? (0) | 2020.11.04 |
---|---|
자바는 오픈 소스 프로그래밍 언어입니까? (0) | 2020.11.04 |
jquery Enter 키를 활성화하고 이벤트를 탭으로 변경하는 방법 (0) | 2020.11.04 |
Bash 완성의 맥락에서 $ {array [*]}와 $ {array [@]}에 대한 혼동 (0) | 2020.11.04 |
MVC 반환 부분보기를 JSON으로 (0) | 2020.11.04 |