根据需要“即时”标记字段

时间:2011-12-12 11:19:42

标签: asp.net-mvc-3 jquery-validate

使用ASP.NET MVC3,Razor和jQuery Unobtrusive验证(由Microsoft提供的开箱即用)。

如何“即时”标记字段,即仅在某些情况下?例如,如果用户处于“发布者”角色,则会出现“发布日期”和“发布”按钮。按下“发布”按钮时需要“发布日期”字段,但在“保存草稿”按钮时则不需要。如果用户不在该角色中,则表单中不会显示“发布”按钮,因此不需要。

我确信这不是可以开箱即用的东西,客户端(jQuery Validate)和服务器端都需要额外的代码。如果可以的话,如何做到这一点并不明显。

3 个答案:

答案 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()
    }
};

这就像一个魅力:) 祝你好运。