2012-07-15 53 views
0

我在Model.IsValid屬性不需要的時候遇到問題。Model.IsValid在不需要的屬性上遇到問題

這是代碼。

BeginForm在Edit.cshtml文件

@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:

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; } 

_MemberForm.cshtml的塊(部分)

<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 。那麼爲什麼這兩個人是必需的?它是一個謎。

+0

我在編輯動作中添加了ModelState.Remove(「PunchCard.Times」)並解決了這個問題,但是還有其他解決方案嗎?我嘗試了[Bind(Exclude)]屬性,但這不起作用。 – n3tx 2012-07-15 17:49:11

回答

0

你不應該同時使用你的文本框中disabledreadonly屬性:

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

我猜殘疾人屬性優先,當你提交表單的id值永遠不會被髮送到服務器。這就是爲什麼你會得到一個模型狀態錯誤。因爲你的id屬性是必需的。現在你可能會告訴我它沒有用[Required]屬性來裝飾,但這並不重要。由於您已將其聲明爲不可空的整數,因此它是隱式需要的,並且框架自動使其成爲必需。如果你不希望發生這種情況,你應該聲明它爲可空的整數。

所以回到你的看法,如果你想只顯示編號,而不允許用戶修改它,使用只讀:

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

顯然不認爲,如果你犯了一個文本框只讀的用戶不能修改它。普通用戶不會。但是黑客總是可以把他想要的任何價值放在這個文本框中,並僞造一個請求。所以絕對不要把它作爲某種安全或某種東西。

+0

thx代表達林,但會員和衝牀卡是什麼?爲什麼在沒有[必須]屬性時需要它們?當我使用ModelState.Remove它的作品,但我得到這個日期成員從/到0001-01-01 00:00:00,有什麼想法?值得一提的 – n3tx 2012-07-15 21:24:21

+0

是我刪除了禁用的屬性,但仍然沒有使用Membership和PunchCard,所以這不是問題。問題在於那兩個。我檢查過ModelState。 – n3tx 2012-07-15 21:26:10

+0

您還沒有顯示這兩種類型的自定義編輯器模板,也沒有顯示這些類型的外觀,因此很難說。 – 2012-07-16 05:52:45