2012-07-15 50 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