Asp.net mvc 4 在Kendo选项卡和Strip选项卡之间导航时进行ModelView验证
我正在尝试在提交到服务器之前修复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
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]”指定特定的内容
剑道验证器不会遇到同样的问题,但是如果选项卡不在视图中,用户就不会知道它有错误,因此您需要一些摘要,或者尝试找出哪个选项卡有错误,然后选择它。您有没有发现这个问题?我们有同样的问题。