使用ASP.NET MVC3,Razor和jQuery Unobtrusive验证(由Microsoft提供的开箱即用)。
如何“即时”标记字段,即仅在某些情况下?例如,如果用户处于“发布者”角色,则会出现“发布日期”和“发布”按钮。按下“发布”按钮时需要“发布日期”字段,但在“保存草稿”按钮时则不需要。如果用户不在该角色中,则表单中不会显示“发布”按钮,因此不需要。
我确信这不是可以开箱即用的东西,客户端(jQuery Validate)和服务器端都需要额外的代码。如果可以的话,如何做到这一点并不明显。
答案 0 :(得分:1)
如果您在webform-land中执行此操作,则可以在按钮的单击事件处理程序中实例化RequiredFieldValidator,并将其应用于应该成为必需的字段。
在mvc-land中,这并不明显。 This SO question/answer demonstrates how to handle a button click - 您可以扩展它以实例化RequiredFieldValidator并将其应用于字段。
在jquery中你可以添加如下内容:
$("#buttonid").on("click", function() { $("#fieldToBeRequiredId").rules("add", {
required: true }); }
答案 1 :(得分:0)
这听起来像是模型不太具体,而且视图更具特色。即使你可以动态地将这种性质的需求绑定到模型,但是在将模型逻辑与视图逻辑分离时,它将违背MVC的目的。我建议你为一个拥有" Publisher"的角色的模型创建一个包含的发布控件的模板(以及支持验证)。
答案 2 :(得分:0)
我将在一个简短的例子中解释这个想法。我们有'IsMasterProject'复选框来设置'MasterProjectNo'字段所需的内容:
要做“飞行中”所需,您需要以下内容:
使用字段定义模型,不严格[必需]
True
使用示例字段代码创建视图:
False
添加Java脚本以处理点击代码并添加或删除“必需”标记:
class ProjectList {
public bool IsMasterProject { get; set; }
// this field will be optionally required,
// we do not need the [Required] attribute
public string MasterProjectNo { get; set; }
}
在控制器中,您可以准备节目动作:
<div class="data-field">
<div class="editor-label">
<div id="IsMasterProjectLabel">
Is Master Project
</div>
</div>
<div class="editor-field">
<input id="IsMasterProject" class="check-box" type="checkbox" value="true" name="IsMasterProject" data-val-required="The IsMasterProject field is required." data-val="true" checked="checked">
</div>
</div>
<div class="data-field">
<div class="editor-label">
<div id="MasterProjectNoLabel">
Master Project No
</div>
</div>
<div class="editor-field">
<input id="MasterProjectNo" type="text" value="" title="" style="width: 9.2em" placeholder="" name="MasterProjectNo" maxlength="15" data-val-length-max="15" data-val-length="The field MasterProjectNo must be a string with a maximum length of 15." data-val="true">
</div>
</div>
在保存操作中,您可以验证所需的条件:
$(function () {
$("#IsMasterProject").change(function () { OnIsMasterProjectValueChange(); });
OnIsMasterProjectValueChange();
});
function OnIsMasterProjectValueChange() {
if ($('#IsMasterProject').is(':checked')) {
$('#IsMasterProjectLabel').append('<span class="label-required">*</span>');
}
else {
$('#IsMasterProjectLabel span').remove()
}
};
这就像一个魅力:) 祝你好运。