2012-07-15 2 views
0

불필요한 속성에서 Model.IsValid에 문제가 있습니다.Model.IsValid에 문제가 없습니다. 필요하지 않은 속성에

다음은 코드입니다. Edit.cshtml에

BeginForm

@using (Html.BeginForm("Edit", "Member", FormMethod.Post, new { enctype = "multipart/formdata" })) 
{ 
    @Html.Partial("_MemberForm", Model.Member) 
} 

MemberEditViewModel 파일 (Edit.cshtml 파일 사용)

public class MemberEditViewModel 
{ 
    public MemberFormModel Member { get; set; }   
} 

MemberFormModel : _MemberForm.cshtml의

public class MemberFormModel : ICreateMemberCommand, IValidatableObject 
{ 
    public int Id { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 

    [Required] 
    public string SocialSecurityNumber { get; set; } 

    [Required]   
    public int PinCode { get; set; } 

    [Required]   
    public char Gender { get; set; } 

    public string Email { get; set; } 

    [Required]   
    public string Address { get; set; } 

    [Required]   
    public string ZipCode { get; set; } 

    [Required] 
    public string ZipAddress { get; set; } 

    public string Phone { get; set; }   
    public string Phone2 { get; set; } 

    [Required] 
    public string City { get; set; } 

    [Required] 
    public int CountryId { get; set; } 

    //not required (but still displaying error it's required) 
    public Membership Membership { get; set; } 

    // not required (displaying error it's required) 
    public PunchCard PunchCard { get; set; } 

    public bool IsActive { get; set; } 

블록 (부분)

<fieldset>    
     <dl> 
      <dt>@Html.LabelFor(m => m.Id)</dt> 
      <dd>@Html.TextBoxFor(m => m.Id, new { disabled = "disabled", @readonly = "readonly" })</dd> 

      <dt>@Html.LabelFor(m => m.PinCode)</dt> 
      <dd>@Html.EditorFor(m => m.PinCode)</dd> 

      <!-- problem with membership, maybe with the .FromData/ToDate ? --> 
      <dt>@Html.LabelFor(m => m.Membership)</dt> 
      <dd>@Html.EditorFor(m => m.Membership.FromDate, new { @name = "Membership" }) - 
       @Html.EditorFor(m => m.Membership.ToDate, new { @name="Membership"})</dd> 

      <!-- problem with punch card, maybe with the .Times ? --> 
      <dt>@Html.LabelFor(m => m.PunchCard)</dt> 
      <dd>@Html.EditorFor(m => m.PunchCard.Times, new { @name = "PunchCard" })</dd> 
     </dl> 
    </fieldset> 

MemberController 편집 작업

// POST: /Members/10002/Edit 
    [HttpPost] 
    public ActionResult Edit(FormCollection formValues, MemberFormModel memberForm) 
    { 
     var errors = ModelState.Values.SelectMany(v => v.Errors); 

     if(IsSaveOperation(formValues)){ 
      if(TryUpdateMember(memberForm)){ 
       return RedirectToAction("Details", "Member", new {id = memberForm.Id}); 
      } 
     } 

     var mm = new MemberEditViewModel{ Member = memberForm }; 
     return View(mm); 
    } 

Membership.cs

public class Membership 
{ 
    public Membership(){ /* empty constructor */} 
    public Membership(int id, int memberId, DateTime fromDate, DateTime toDate) 
    { 
     Id = id; 
     MemberId = memberId; 
     FromDate = fromDate; 
     ToDate = toDate; 
    } 

    public int Id { get; set; } 
    public int MemberId { get; set; } 

    [DataType(DataType.Date)] 
    public DateTime FromDate { get; set; } 

    [DataType(DataType.Date)] 
    public DateTime ToDate { get; set; } 
} 

PunchCard.cs

당신은 내가 어떤 [필수] 속성을 가지고 있겠지 참조
public class PunchCard 
{ 
    public PunchCard() { /* empty constructor */ } 
    public PunchCard(int memberId, int times, DateTime createdDate, DateTime modifiedDate) 
    { 
     this.MemberId = memberId; 
     this.Times = times; 
     this.CreatedDate = createdDate; 
     this.ModifiedDate = modifiedDate; 
    } 

    public int Id { get; set; } 
    public int MemberId { get; set; } 
    public int Times { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public DateTime ModifiedDate { get; set; } 
} 

, 어느 것도 MemberFormModel에서 . 그렇다면 그 두 명은 어떻게 필요합니까? 그것의 신비.

@Html.TextBoxFor(m => m.Id, new { disabled = "disabled", @readonly = "readonly" }) 

내가 장애인 속성이 우선 당신이 양식을 제출하면 ID 값이 서버로 전송되지 않습니다 같아요

+0

편집 작업에서 ModelState.Remove ("PunchCard.Times")를 추가했는데 문제가 해결되었지만 다른 해결책이 있습니까? [Bind (Exclude)] 속성을 시도했지만 작동하지 않습니다. – n3tx

답변

0

당신은 당신의 텍스트 상자에 disabledreadonly 속성을 모두 사용하지 않아야 . 그래서 당신은 모델 상태 오류를 얻습니다. id 속성이 필요하기 때문입니다. 이제 아마 [Required] 속성으로 꾸며지지 않았다고 말할 것입니다. 그러나 이것은 중요하지 않습니다. null이 허용되지 않는 정수로 선언 했으므로 암시 적으로 필요하므로 프레임 워크가 자동으로이를 요구합니다. 이것을 원하지 않으면 null 허용 가능 정수로 선언해야합니다. 그래서 다시보기로

, 당신은 단지 디스플레이 ID하려는 경우, 사용자가 수정할 수없는 읽기 전용 사용

@Html.TextBoxFor(m => m.Id, new { @readonly = "readonly" }) 

을 분명히 생각하지 않는 당신은 읽기 전용의 텍스트 상자를 만든 경우 사용자가 수정할 수 없습니다. 일반 사용자는 그렇지 않습니다. 그러나 해커는 항상이 텍스트 상자에 원하는 값을 입력하고 요청을 위조 할 수 있습니다. 그래서 절대적으로 보안이나 뭔가의 일종 으로이 의존하지 않습니다.

+0

대런에게 머리를 쓰다. 그러나 멤버십 카드와 펀치 카드는 어떻게 되나요? [Required] 속성이 없는데 왜 필요합니까? ModelState.Remove를 사용할 때 작동하지만, 회원 날짜/시간 0001/1-01 00:00:00, 아이디어가 있습니까? 가치가있는 – n3tx

+0

은 내가 disabled 속성을 제거했지만 Membership과 PunchCard로는 여전히 작동하지 않으므로 문제가되지 않습니다. 문제는 그 두 가지입니다. ModelState를 확인했습니다. – n3tx

+0

두 가지 유형에 대한 사용자 정의 편집기 템플리트가 표시되지 않았고 해당 유형이 어떻게 보이는지 알려주지 않으므로. –

관련 문제