2013-05-18 18 views
0

簡而言之 - 在我的視圖中,數據驗證屬性僅添加用於收集的第一個對象的輸入。我希望能夠驗證我的View中集合的任何對象的輸入。我正在使用Asp.net MVC4,jquery.validate.unobtrusive。收集項目的客戶端驗證Asp.Net MVC

更多詳細信息: 我在我的項目中有一個管理頁面,我希望顯示所有產品類別。任何這些類別都可以編輯。在編輯過程結束時,用戶可以點擊按鈕保存所有更改。

我的視圖模型:

public class CategoriesManagementViewModel 
{ 
    [Required(ErrorMessage = Validation.FieldRequiredMsg)] 
    public int Id { get; set; } 

    [Required(ErrorMessage = Validation.FieldRequiredMsg)] 
    [StringLength(50, ErrorMessage = Validation.MaxLength50Msg)] 
    public string Name { get; set; } 

    [Required(ErrorMessage = Validation.FieldRequiredMsg)] 
    [Range(0, int.MaxValue, ErrorMessage = Validation.PositiveNumberMsg)] 
    public int AmountForDiscount { get; set; } 

    [Required(ErrorMessage = Validation.FieldRequiredMsg)] 
    [Range(0, 100, ErrorMessage = Validation.PercentMsg)] 
    public int DiscountPercent { get; set; } 

    public bool IsActive { get; set; } 
} 

這裏是控制器:

public JsonResult GetProductCategories(int currentPage) 
    { 
     using (var service = new DalServiceSoapClient()) 
     { 
      var data = service.GetProductCategories(currentPage, Constants.ItemsOnPage,false) 
       .Select(x=> new CategoriesManagementViewModel(x)); 
      var html = RenderRazorViewToString("_ManageCategoriesPartial", data); 
      return Json(new { status = "success", html = html }); 
     } 

    } 

在控制器我從數據庫中獲取數據,將其轉換爲我的ViewModels的收集和傳遞給局部視圖。部分視圖呈現爲html字符串,以json形式發送,並更新了部分視圖。

這裏是局部視圖:

@model IEnumerable<GreenLightShop.Models.CategoriesManagementViewModel> 
@{ 
    Layout = null; 
    var i = 0; 
} 

@foreach (var item in Model) 
{ 
    var blockedClass = "";  
    var blockBtnCaption = "Block"; 

if (!item.IsActive) 
{ 
    blockedClass = "blocked"; 
    blockBtnCaption = "UnBlock"; 
} 

<div class='box @blockedClass' itemid="@item.Id" ischanged="false" isactive  ="@item.IsActive"> 

    <div class="show"> 
     <span>@item.Name</span> 
     |&nbsp;<a href="#" class="edit-category-btn">Edit Category</a> 
     |&nbsp;<a href="#" class="edit-products-btn">Edit Product</a> 
     |&nbsp;<a href="#" class="block-btn"> @blockBtnCaption </a> |&nbsp; 
    </div> 
    <form class="edit hidden"> 

     <div class="form-field"> 
      <label> Name:</label> 
      @Html.TextBoxFor(x => x.ElementAt(i).Name) 
     @* @Html.HiddenFor(x=>x.ElementAt(i).Name)*@ 
      <div> 
       @Html.ValidationMessageFor(x => x.ElementAt(i).Name)  
      </div> 
     </div> 

     <div class="form-field"> 
      <label> Amount For Discount:</label> 
      @Html.TextBoxFor(x => x.ElementAt(i).AmountForDiscount) 
      @* @Html.HiddenFor(x => x.ElementAt(i).AmountForDiscount)*@ 
      <div> 
       @Html.ValidationMessageFor(x => x.ElementAt(i).AmountForDiscount)  
      </div> 
     </div> 

     <div class="form-field"> 
      <label> Discount:</label> 
      @Html.TextBoxFor(x => x.ElementAt(i).DiscountPercent) 
      @* @Html.HiddenFor(x => x.ElementAt(i).DiscountPercent)*@ 
      <div> 
       @Html.ValidationMessageFor(x => x.ElementAt(i).DiscountPercent)  
      </div> 
     </div> 

     <input type="button" class="accept-changes-btn" value="Apply"/> 
     <input type="button" class="cancel-changes-btn" value="Cancel"/> 
    </form> 
</div> 

    i++; 
} 

對於 IEnumerable<GreenLightShop.Models.CategoriesManagementViewModel>,驗證屬性添加到窗體上的每個輸入的第一個元素。

<input id="Name" type="text" value="CategoryName" name="Name" data-val-required="This field is required." data-val-length-max="50" data-val-length="Not longer than 50 characters." data-val="true">. 

驗證正常工作。

對於所有其他類別的輸入,不會添加驗證屬性。

<input id="Name" type="text" value="AnotherCategory" name="Name"> 

當用戶點擊

<input type="button" class="accept-changes-btn" value="Apply"/>`, 

我解析修改類的輸入字段與$.validator.unobtrusive.parse($(this));

所有產品類別都顯示正常,當我提交Model.IsValid工作正常,也結合變化和數據作品。

如何爲每個類別進行驗證?

在此先感謝。

回答

0

這裏是我找到的解決方案: 問題是,我使用的每個表格都使用<Form>標籤。當我將其更改爲@using(Html.BeginForm())問題已修復。現在,我的視圖中的每個表單中的每個輸入都具有驗證屬性。

如果有人知道解釋,爲什麼發生這種情況,我很樂意聽到它。