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

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

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

===============>>#1 票数:1

如果您在webform-land中执行此操作,则可以在按钮的单击事件处理程序中实例化RequiredFieldValidator,并将其应用于应该成为必需的字段。

在mvc-land中,这并不明显。 这个问题/答案演示了如何处理按钮单击 - 您可以扩展它以实例化RequiredFieldValidator并将其应用于字段。

在jquery中,您可以添加以下内容:

$("#buttonid").on("click", function() { $("#fieldToBeRequiredId").rules("add", {
 required: true  }); }

===============>>#2 票数:0

我将在一个简短的例子中解释这个想法。 我们有'IsMasterProject'复选框来设置'MasterProjectNo'字段所需:

要做“飞行中”所需,您需要以下内容:

使用字段定义您的模型,这不严格[必需]

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>

添加Java脚本以处理点击代码并添加或删除“必需”标记:

$(function () {

    $("#IsMasterProject").change(function () { OnIsMasterProjectValueChange(); });
    OnIsMasterProjectValueChange();
});

function OnIsMasterProjectValueChange() {
    if ($('#IsMasterProject').is(':checked')) {
        $('#IsMasterProjectLabel').append('<span class="label-required">*</span>');
    }
    else {
        $('#IsMasterProjectLabel span').remove()
    }
};

在控制器中,您可以准备show动作:

[Authorize]
public ActionResult Edit(int id)
{
    try
    {
        ProjectList project = prepare_ProjectList(id);

        return View(project);
    }
    catch (Exception ex)
    {
        sysHelper.LogError(ex, ModelState); ModelState.AddModelErrorException(ex, Request, "Probably selected data doesn't exist."); return View("Error");
    }
}

在保存操作中,您可以验证所需的条件:

[HttpPost]
public ActionResult Edit(ProjectList project)
{
    try
    {
        if (ModelState.IsValid)
        {
            /* ------------------------------------------------------------------------ */
            /* HERE YOU CAN ADD YOUR CODE TO CHECK THE FIELD                            */
            /* ------------------------------------------------------------------------ */

            if (project.IsMasterProject && string.IsNullOrEmpty(project.MasterProjectNo))
            {
                ModelState.AddModelError("Model", "The MasterProjectNo field is required.");
            }

            /* ------------------------------------------------------------------------ */

            else
            {
                project.UserID = CurrentUser.ID;
                project.C_updated = DateTime.Now;

                db.ProjectList.Attach(project);
                db.Entry<ProjectList>(project).State = System.Data.Entity.EntityState.Modified;

                db.SaveChanges();

                return RedirectToAction("Index");
            }
        }
    }
    catch (Exception ex)
    {
        sysHelper.LogError(ex, ModelState);

        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
    }

    prepareViewBag(project);

    return View(project);
}

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

===============>>#3 票数:0

这听起来像是模型更少,更具视图。 即使你可以动态地将这种性质的需求绑定到模型,但是在将模型逻辑与视图逻辑分离时,它将违背MVC的目的。 当您拥有一个拥有“Publisher”角色的模型时,我建议您为包含的发布控件创建一个模板(以及支持验证)。

  ask by SamWM translate from so

未解决问题?本站智能推荐:

4回复

仅在字段可见时才需要验证

我在ASP.NET MVC 3中使用[Required]属性进行客户端验证。 该课程看起来像: 我希望仅在可见的情况下验证字段FirstName ,该字段仅在某些条件下显示。 我怎样才能做到这一点? 我使用了以下内容,但它仍然希望验证该隐藏字段的必填字段。
1回复

MVC 3.0 ViewModels - Id字段是强制要求的,即使我没有标记它[必需]

我有一个像这样的ViewModel设置.. 这应该工作正常。 Id字段的原因是因为模型绑定器需要知道ID以便稍后编辑。 但它将使用@Html.HiddenFor(model => model.Id)呈现。 但出于某种原因,jQuery的Unobtrusive Validati
3回复

验证隐藏字段

我正在使用MVC3进行不显眼的验证。 我有一个字段,用户需要填写一些数据,然后按“搜索”按钮。 如果从未按下搜索或用户在按搜索后更改了输入字段,则无法提交表单。 我添加了一个隐藏字段,该字段由按钮的click()事件设置为true并由输入框的keyup()事件清空。 现在我想添加一个
2回复

MVC3 / 4验证隐藏字段

我已经为我的表单设置了模型验证,但验证似乎根本不起作用。 我不认为任何人可以提供帮助。 我已经尝试过使用下面的解决方法,但这会在firebug中不断提出“未定义”错误。 示例解决脚本: 示例文本字段(注意:名称为customer的自动填充文本字段): 示例隐藏字段(注意
1回复

验证在after或append之后插入的字段

我有一个带有ASP MVC3的表单,并且input字段使用jQuery validate plugin v1.8(带有MVC3的默认jQuery验证)进行了验证。 这工作正常,但是问题是当我插入新字段以使用after或append函数进行验证时。 如果我有这个HTML: <lab
1回复

显示:没有字段未发布到控制器

我有一个灯箱,其中包含一堆输入元素,这些输入元素是我使用HTML帮助器创建的操作所设置的。 它们是可选字段,但是我在jquery验证中确实将数字规则应用于它们。 用户可以打开此灯箱,并根据需要填写这些字段,但这不是必需的。 它与其余数据的格式相同,但是要提交,他们必须关闭此灯箱。
1回复

如何在readonly字段上禁用jquery验证?

我正在使用的产品使用JQuery验证和MVC3在幕后工作。 我有一个字段,我切换为只读(基于下拉列表的值是否> 0)。 诀窍是,当该字段不是只读时需要该字段,并且当它是只读时需要提交而没有错误,无论它是否有数据。 我该怎么做呢?
1回复

没有表单标记的ASP.NET MVC3客户端验证

我有一个包含一些输入字段的视图。 它们绑定到视图模型。 他们还有验证消息。 但是视图没有表单标记(Ajax.BeginForm和Html.BeginForm)。 用户输入一些输入,从表中选择(通过复选框)某些行,然后单击按钮。 我已在客户端处理此按钮的单击事件,并编写了一个AJAX
2回复

使用jQuery验证货币字段的客户端验证

我在asp.net mvc 3应用程序上使用jquery.validate时遇到问题。 至少在西班牙,我们使用“,”将数字与小数点相除。 好的,如果我输入以下内容,则使用服务器端验证: 12.55当服务器验证它时,它说该值无效。 如果我输入:12,55可以。 到目前为止,一
2回复

验证其他字段而不会导致无限循环

我遇到的情况是,我正在创建一个不打扰的验证器,该验证器仅在验证的字段不为空时才必须验证是否需要另一个字段(反之亦然)。 问题是,在某些极端情况下,其他字段不会重新验证,我想强迫它重新验证自身而不会引起无限循环。 我的验证方法如下所示: 参数是我的另一个领域(都是文本框)。 如果