Asp.net mvc 4 在Kendo选项卡和Strip选项卡之间导航时进行ModelView验证

Asp.net mvc 4 在Kendo选项卡和Strip选项卡之间导航时进行ModelView验证,asp.net-mvc-4,kendo-ui,jquery-ui-tabs,telerik-mvc,kendo-asp.net-mvc,Asp.net Mvc 4,Kendo Ui,Jquery Ui Tabs,Telerik Mvc,Kendo Asp.net Mvc,我正在尝试在提交到服务器之前修复modelview的验证问题 这是主视图模型 public class AdmissionViewModel { public int OperatorID { get; set; } /* some other members */ public AdmissionFeeViewModel Fee { get; set; } public AdmissionFallDateViewModel

我正在尝试在提交到服务器之前修复modelview的验证问题

这是主视图模型

    public class AdmissionViewModel
    {
        public int OperatorID { get; set; }

/* some other members */

        public AdmissionFeeViewModel Fee { get; set; }

        public AdmissionFallDateViewModel FallAdmission { get; set; }

        public AdmissionDateViewModel SpringAdmission { get; set; }

        public AdmissionDateViewModel SummerAdmission { get; set; }


    }
以下是上述ViewModel成员的定义

public class AdmissionFeeViewModel
{
    public AdmissionFeeBaseModel Domestic { get; set; }
    public AdmissionFeeBaseModel International { get; set; }
}
-->基本模型

 public class AdmissionFeeBaseModel
    {
        public int? AdmissionFeeID { get; set; }

    [Required(ErrorMessage = "Application Fee is required")]
    public decimal? ApplicationFee { get; set; }

    public string ApplicationFeeWaiver { get; set; }

    public string FeeWaiverNotes { get; set; }

    public string FeeDataUrl { get; set; }
}


public class AdmissionFallDateViewModel
{
    public AdmissionFallDateBaseModel Domestic { get; set; }
    public AdmissionFallDateBaseModel International { get; set; }
}
-->基本模型

public class AdmissionFallDateBaseModel: AdmissionDateBaseModel
{
    [Display(Name = "Early Decision Offered")]
    public override string PriorityDecisionOffered { get; set; }

    [Display(Name = "Early Decision Deadline")]
    public override string PriorityDecisionDeadline { get; set; }

    [Display(Name = "Early Decision Notification")]
    public override string PriorityDecisionNotificationDate { get; set; }

    [Display(Name = "Early Decision Deposit Deadline")]
    public override string PriorityDecisionDepositDeadline { get; set; }

    [Display(Name = "Financial Aid Application Deadline")]
    public override string PriorityFinancialAidAppDeadline { get; set; }

    [Display(Name = "Early Action Offered")]
    public string PriorityActionOffered { get; set; }

    [Display(Name = "Early Action Deadline")]
    public string PriorityActionDeadline { get; set; }

    [Display(Name = "Early Action Notification")]
    public string PriorityActionNotificationDate { get; set; }

    [Display(Name = "Early Decision  or Action Notes")]
    public override string PriorityAdmissionNotes { get; set; }

    [Display(Name = "Data URL")]
    public override string PriorityDataURL { get; set; }
}

public class AdmissionDateViewModel
{
    public AdmissionDateBaseModel Domestic { get; set; }
    public AdmissionDateBaseModel International { get; set; }
}
-->基本模型

public class AdmissionDateBaseModel
    {
        [HiddenInput]
        public int? AdmissionDateID { get; set; }

        [Display(Name = "Regular Admission Deadline")]
        public string ApplicationDeadline { get; set; }

        [Display(Name = "Regular Admission Notification")]
        public string AdmissionNotificationDate { get; set; }

        [Display(Name = "Regular Admission Deposit Deadline")]
        public string DepositDeadline { get; set; }

        [Display(Name = "Accept Offer of Admission")]
        public string AcceptOfferDeadline { get; set; }

        [Display(Name = "Waiting List Used")]
        public string WaitingListUsed { get; set; }

        [Display(Name = "Deferred Admission")]
        public string DeferAdmission { get; set; }

        [Display(Name = "Transfer Admission")]
        public string TransferAdmission { get; set; }

        [Display(Name = "Financial Aid Application Deadline")]
        public string FinancialAidAppDeadline { get; set; }

        [Display(Name = "Admission Notes")]
        public string AdmissionNotes { get; set; }

        [Display(Name = "Data URL")]
        public string DataURL { get; set; }

        [Display(Name = "Priority Decision Offered")]
        public virtual string PriorityDecisionOffered { get; set; }

        [Display(Name = "Priority Decision Deadline")]
        public virtual string PriorityDecisionDeadline { get; set; }

        [Display(Name = "Priority Decision Notification Date")]
        public virtual string PriorityDecisionNotificationDate { get; set; }

        [Display(Name = "Priority Decision Deposit Deadline")]
        public virtual string PriorityDecisionDepositDeadline { get; set; }
    [Display(Name = "Priority Financial Aid Application Deadline")]
    public virtual string PriorityFinancialAidAppDeadline { get; set; }

    [Display(Name = "Admission Notes")]
    public virtual string PriorityAdmissionNotes { get; set; }

    [Display(Name = "Data URL")]
    public virtual string PriorityDataURL { get; set; }
}
这是主视图,其中Kendo().TabStrip包含4个选项卡,每个选项卡分别对应于AdmissionViewModel中的每个成员

    public class AdmissionViewModel
    {
        public int OperatorID { get; set; }

/* some other members */

        public AdmissionFeeViewModel Fee { get; set; }

        public AdmissionFallDateViewModel FallAdmission { get; set; }

        public AdmissionDateViewModel SpringAdmission { get; set; }

        public AdmissionDateViewModel SummerAdmission { get; set; }


    }
@model UniversityApp.ViewModels.AdmissionViewModel
@Html.HiddenFor(model => model.OperatorID)

<table>

<tr>
    <td>
    @(Html.Kendo().TabStrip()
    .Name("tabAdmission")
    .Events(events => events
        .Select("tabAdmissionOnSelect")
    )
    .Animation(false)

    .Items(items =>
    {
        items.Add().Text("Application Fees").Content(@<text>
        @Html.EditorFor(m => m.Fee)
        </text>).Selected(true);
        items.Add().Text("Fall Admission").Content(@<text>
        @Html.EditorFor(m => m.FallAdmission)
        </text>);
        items.Add().Text("Spring Admission").Content(@<text>
        @Html.EditorFor(m => m.SpringAdmission)
        </text>);
        items.Add().Text("Summer Admission").Content(@<text>
        @Html.EditorFor(m => m.SummerAdmission)
        </text>);
    })
)
    </td>
</tr>
</table>
@model UniversityApp.ViewModels.AdmissionViewModel
@Html.HiddenFor(model=>model.OperatorID)
@(Html.Kendo().TabStrip())
.姓名(“Tab许可”)
.Events(Events=>Events
.选择(“Tab许可选择”)
)
.动画(错误)
.项目(项目=>
{
items.Add().Text(“申请费”).Content(@
@EditorFor(m=>m.Fee)
).选定(正确);
items.Add().Text(“秋季入学”).Content(@
@EditorFor(m=>m.fall)
);
items.Add().Text(“春季入学”).Content(@
@EditorFor(m=>m.SpringAdmission)
);
items.Add().Text(“夏季入学”).Content(@
@EditorFor(m=>m.summer)
);
})
)
-->下面是kendo.tabstrip使用的子视图

@model UniversityApp.ViewModels.AdmissionFeeViewModel
@Html.HiddenFor(model => model.Domestic.AdmissionFeeID)
@Html.HiddenFor(model => model.International.AdmissionFeeID)
<table>
    <tr>
        <th></th>
        <th>Domestic Applicant</th>
        <th>International Applicant</th>
    </tr>
    <tr>
        <td><label>Application Fee</label></td>
        <td>
            @Html.EditorFor(model => model.Domestic.ApplicationFee)
            @Html.ValidationMessageFor(model => model.Domestic.ApplicationFee)
        </td>
        <td>
            @Html.EditorFor(model => model.International.ApplicationFee)
            @Html.ValidationMessageFor(model => model.International.ApplicationFee)
        </td>
    </tr>
    <tr>
        <td><label>Application Fee Waiver</label></td>
        <td>
            @Html.EditorFor(model => model.Domestic.ApplicationFeeWaiver)
            @Html.ValidationMessageFor(model => model.Domestic.ApplicationFeeWaiver)
        </td>
        <td>
            @Html.EditorFor(model => model.International.ApplicationFeeWaiver)
            @Html.ValidationMessageFor(model => model.International.ApplicationFeeWaiver)
        </td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td><input type="button" btn-next-tab="true"  value="Next" /></td>
    </tr>
@model university app.ViewModels.AdmissionFeeViewModel
@Html.HiddenFor(model=>model.dominal.AdmissionFeeID)
@Html.HiddenFor(model=>model.International.AdmissionFeeID)
国内申请人
国际申请人
申请费
@EditorFor(model=>model.dominal.ApplicationFee)
@Html.ValidationMessageFor(model=>model.dominal.ApplicationFee)
@EditorFor(model=>model.International.ApplicationFee)
@Html.ValidationMessageFor(model=>model.International.ApplicationFee)
申请费用豁免
@EditorFor(model=>model.dominal.application)
@Html.ValidationMessageFor(model=>model.dominal.ApplicationFeeFor)
@EditorFor(model=>model.International.application)
@Html.ValidationMessageFor(model=>model.International.applicationFeeFor)
/*儿童视图*/

 @model UniversityApp.ViewModels.AdmissionDateViewModel
@Html.HiddenFor(model => model.Domestic.AdmissionDateID)
@Html.HiddenFor(model => model.International.AdmissionDateID)


<table>
    <tr>
        <th></th>
        <th>Domestic Applicant</th>
        <th>International Applicant</th>
    </tr>
    <tr>
        <td>@Html.LabelFor(model => model.Domestic.ApplicationDeadline)</td>
        <td>
            @Html.EditorFor(model => model.Domestic.ApplicationDeadline)
            @Html.ValidationMessageFor(model => model.Domestic.ApplicationDeadline)
        </td>
        <td>
            @Html.EditorFor(model => model.International.ApplicationDeadline)
            @Html.ValidationMessageFor(model => model.International.ApplicationDeadline)
        </td>
    </tr>
/* all other properties */
    <tr>
        <td><input type="button" btn-previous-tab="true" value="Previous" /></td>
        <td></td>
        <td><input type="button" btn-next-tab="true" value="Next" /></td>
    </tr>
</table>
@model UniversityApp.ViewModels.AdmissionDateViewModel
@Html.HiddenFor(model=>model.dominal.AdmissionDateID)
@Html.HiddenFor(model=>model.International.AdmissionDateID)
国内申请人
国际申请人
@LabelFor(model=>model.dominal.applicationADLINE)
@EditorFor(model=>model.dominal.ApplicationDeadline)
@Html.ValidationMessageFor(model=>model.dominal.ApplicationDeadline)
@EditorFor(model=>model.International.applicationAdline)
@Html.ValidationMessageFor(model=>model.International.ApplicationDeadline)
/*所有其他财产*/
同样,我们还有两个子视图

无论如何,问题是: 当我点击主视图中的submit(save)按钮时,所有必填字段都会响起铃声,但如果我在任何其他没有必填字段的选项卡上,并点击submit,
表单提交时没有出现客户端验证错误。

我也有同样的问题,经过调查,jQuery Validate默认会忽略任何
:隐藏的

:隐藏的
定义为

  • CSS显示值为“无”
  • 使用type=“hidden”设置表单元素
  • 宽度和高度设置为0
  • 祖先元素是隐藏的
如果未选择选项卡条,则将其设置为
display:none
,因此验证将忽略输入,因为其祖先是
:hidden
display:none

我使用的解决方法是将其添加到视图中

<script>
    $(document).ready(function() {
        $("form").data("validator").settings.ignore = "";
    });
</script>

$(文档).ready(函数(){
$(“表单”).data(“验证器”).settings.ignore=“”;
});
它现在当然会验证视图中的所有内容,包括您的隐藏输入,因此可能不是正确的方法,但可能会有所帮助。您可以始终对
$(“form”).data(“validator”).settings.ignore=“input[type=hidden]”指定特定的内容


剑道验证器不会遇到同样的问题,但是如果选项卡不在视图中,用户就不会知道它有错误,因此您需要一些摘要,或者尝试找出哪个选项卡有错误,然后选择它。

您有没有发现这个问题?我们有同样的问题。