簡體   English   中英

列表驗證(數據注釋)在客戶端不起作用

[英]List validation(data annotation) not working on the client side

我有一個Groups列表,該列表具有與之關聯的自定義屬性方法。 它似乎沒有在屏幕上捕獲驗證錯誤。 但是,在控制器上,它將ModelState.Valid設置為false。 有沒有一種方法可以在視圖中捕獲它,而不必去服務器端然后由我捕獲並顯示它? 其他驗證正在運行,因此缺少jquery文件的情況並非如此。

模型:

   [RequiredList(ErrorMessage = "The {0} field is required.")]
    [Display(Name = "Selected Organization(s)")]
    public List<OrganizationDTO> Organizations { get; set; }

自定義屬性:

public class RequiredListAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list.Count > 0;
        }
        return false;
    }
}

視圖:

<div class="form-group">
     <div class="controls">
          <label class="control-label" for="Selected Groups">Selected Group(s)</label>
               <div class="panel panel-default">
                     <div class="panel-body"  style="overflow-y: auto; max-height: 100px; min-height:50px" id="divSelGroups">
                          @for (int i = 0; Model.Groups!= null && i < Model.Groups.Count(); i++)
                          {
                             var group= Model.Groups[i];
                             var checkedAttr = (group.Id != Guid.Empty) ? "checked='checked'" : "";
                              <div class="row">
                                        <input type="hidden" name="Groups.Index" value="@i" />
                                        <input type="hidden"name="Groups[@i].Name" value="@group.Name" />
                                        <input type="hidden" name="Groups[@i].Data" value="@group.Data" />
                                        <div class="col-xs-1">
                                            <input type="checkbox" name="Groups[@i].Id" value="@group.Id" @checkedAttr data-org-selected="true" />
                                        </div>
                                        <div class="col-xs-11" data-toggle="tooltip" data-placement="top" title="@group.Data">@group.Name</div>
                                </div>
                           }
                     </div>
                  </div>
                  @Html.ValidationMessageFor(m => m.Groups)
          </div>
   </div>

我不得不包括一個變通辦法以使其正常運行,盡管沒有回答我原來的問題仍然可以解決問題。 我必須引入一個隱藏的文本框,其中包含列表項的數量,並在其上放置范圍驗證器。

模型:

[Range(1, double.MaxValue, ErrorMessage = "Atleast one organization needs to be selected.")]
public int OrgCount { get; set; }

視圖:

@Html.TextBoxFor(m => m.OrgCount, new { style="visibility:hidden;height:0"})
@Html.ValidationMessageFor(m => m.OrgCount)

JS腳本:

var orgCount = $(".panel-body  input[name='Organizations.Index']").last().val();
if (isNaN(orgCount))
    orgCount = -1;
$("#OrgCount").val(parseInt(orgCount) + 1);

因此,基本上,如果沒有元素,我將其設為0,因此它們將使驗證失敗,因此將顯示范圍驗證器錯誤消息。

根據上述信息,當控制器中的驗證工作正常但在視圖中不起作用時,則可能與jquery驗證文件有關。

因此,在您看來,如果您沒有引用jquery文件,則可以像下面這樣引用它:

<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>

還要確保在webconfig文件中有以下條目:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

希望以上信息對您有所幫助,請告訴我您的想法或反饋

謝謝

KARTHIK

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM