2011-08-23 7 views
3

Bind-Include를 사용하여 개체 속성의 일부만 편집하더라도 포함되지 않은 속성에 대한 유효성 검사는 계속 실행되고 있습니다. 양식 제출. 여기 ASP.Net MVC 3 - 바인드 포함/제외 및 유효성 검사

내 모델의 단순화 된 버전입니다 :

public partial class MyObject 
{ 
    public int MyObjectId { get; set; } 
    public int personId { get; set; } 
    public string myString1 { get; set; } 
    public Nullable<int> friend1Id { get; set; } 
    public Nullable<int> friend2Id { get; set; } 

    public virtual People person { get; set; } 
    public virtual People Friend1 { get; set; } 
    public virtual People Friend2 { get; set; } 
} 

그리고는 다음과 같습니다 객체에서만 친구 (FRIEND1 및 프렌드)를 편집 할 수있는 컨트롤러가 있습니다

[HttpPost] 
public ActionResult Assignation([Bind(Include = "friend1Id,friend2Id")]MyObject myObject) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(myObject).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    ViewBag.friend1Id = new SelectList(db.People, "personId", "Name", myObject.friend1Id); 
    ViewBag.friend2Id = new SelectList(db.Divisions, "personId", "Name", myObject.friend2Id); 
    return View(myObject); 
} 

을 내 견해로는 친구를 선택하기위한 2 개의 드롭 다운 목록과 저장 버튼이 있습니다. 그러나 저장을 클릭하면 내 모델이 다시 유효하지 않습니다. ModelState 내의 속성 모음을 보면 myString1이 필요하다는 오류 메시지가 나타납니다. myString1은 데이터베이스에 nvarchar (100) NOT NULL 유형이지만 내 바인딩에 포함하지 않았으므로 해당 필드에 대한 유효성 검사가 없을 것이라고 생각했을 것입니다. Bind에 대한 나의 이해가 틀렸는가? 제발 저를 참아주세요, 저는 ASP.Net MVC를 처음 접했습니다. MVC 3 및 ​​EF 4.1 및 강력한 형식의 뷰를 사용하고 있습니다.

답변

1

유효성 검사는 여전히 유효한 모델로 작업하기를 원한다고 생각합니다. 이제 2 개의 속성을 바인딩해도 다른 속성의 기본값은 유효한 모델을 보장 할 수 있습니다.

ModelState.IsValidField :이 부분적으로 유효하지 않은 모델 일을하고 당신은 또한, 이들 중 2 곳을 위해 특별히 확인할 수 있습니다 당신이 IsValidField 방법을 사용하는 경우이 속성의 이름을 통과 할 수있는 다른 필드를 무시하려면 당신이 그 재산에 어떤 필수 속성이없는 경우는 유효성 검사 오류가 발생하는 이유 ("friend1Id") & & ModelState.IsValidField ("friend2Id")는

내가 완전히 이해하지 못하는 것은. 아니면 귀하의 질문에 잘린 것입니까?

또는 두 필드 만있는이 시나리오의 모델 클래스를 사용할 수도 있습니다. 상황을 더 잘 설명하고 데이터베이스 항목을 업데이트하는 것이 더 명확 할 것입니다. (id로 기존 엔터티를 찾고 (btw는 현재 어디에서 오는 ID입니까?) 영구 엔터티의 속성을 "유효한 경우"분기의 코드가 실제로 예상대로 저장할 수 있는지 궁금해합니다 ...)

+0

myString1 필드는 이미 필요에 따라 표시되었지만 삭제되었습니다. 그래서 나는 아직도 그것이 필요한 이유를 이해하지 못한다. 심지어 데이터베이스에서 nullable로 만들었습니다. id 필드에 대해서는 뷰에 MyObjectId에 숨겨진 필드를 넣습니다. 그러나 숨겨진 필드없이 이벤트를 시도한 것과 같은 결과를 얻었으므로 myObject가 업데이트하는 응용 프로그램 "new"을 실제로 이해하지 못합니다. 나는 아직도 "Bind"가 어떻게 작동하고 그것이 무엇을하기로되어 있는지 이해하지 못한다. View Model을 사용하여 솔루션을 시험해 보겠습니다. 좋은 해결책 인 것 같습니다. –