如何验证字段不为空

时间:2015-09-30 20:14:41

标签: c# asp.net-mvc razor

我的视图为abcd.cshtml,代码如下

 @using (Html.BeginForm())
            {                
                @Html.ValidationSummary(true)

            @Html.HiddenFor(model => model.id)
            @Html.HiddenFor(model => model.createtime)

            <h3>Headline</h3>
            <div class="editor-field">
                @Html.EditorFor(model => model.general)
                @Html.ValidationMessageFor(model => model.general)
            </div>
            <a class="anchor" id="keywords"></a>
            <h3>Keywords</h3>
            <div class="editor-field">
                @Html.EditorFor(model => model.keywords)
                @Html.ValidationMessageFor(model => model.keywords)
            </div>
            <a class="anchor" id="relatedcq"></a>
            <h3>Related CQ</h3>
            <div class="editor-field">
                @Html.EditorFor(model => model.relatedcq)
                @Html.ValidationMessageFor(model => model.relatedcq)
            </div>
            <p>
                <input type="submit" value="Create" class="btn btn-primary" />
            </p>

        }

    </div>

控制器很简单abcd.cs,我把它放到DB中

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult Create(staging staging)
        {
            staging.modifiedby = User.Identity.Name;
            staging.lastmodified = DateTime.Now;
            staging.createtime = DateTime.Now;
            try
            {
                db.stagings.Add(staging);
                db.SaveChanges();                
            }
            catch (InvalidOperationException e)
            {
                ViewData["error"] = "An error has occured: " + e.Message;
                return View(staging);
            }
                        return RedirectToAction("Details/" + staging.id);
        }

我想要的是确保填写关键字。如果填写了关键字,我需要有一个弹出窗口,说明&#34;请填写关键字&#34;。 我尝试使用MessageBox.Show()但是为此我必须添加System.Windows.Forms并且与System.Web.Mvc有一些冲突;

2 个答案:

答案 0 :(得分:3)

如果您正在使用htmlhelper,ValidationMessageFor会不会向用户显示验证摘要,则会向他/她显示您需要填写的所有字段?

e.g。 如果您有一个模型,并且您有多个需要归档的字段,可以通过使用[Required]属性修改这些字段/属性或您认为合适的任何其他字段来验证,例如[StringLength]等。

如果这样做,您可以提供验证摘要,如果不符合设置验证,则使用模型绑定器不发布您的数据。 enter image description here 验证摘要示例:

@Html.ValidationSummary(false, "Please provide the details above and then click submit.")

上面将显示标有以下内容的所有字段的所有验证错误,例如@Html.ValidationMessageFor(model => model.relatedcq)

将显示输出(如果存在验证错误)的图像。 希望这会有所帮助:)

答案 1 :(得分:0)

要实现此目的,您需要在服务器端创建自定义验证属性。因此对于例如我们将其命名为MustBeFilled。您的新属性如下所示:

public class MustBeFilledAttribute : ValidationAttribute, IClientValidatable // IClientValidatable for client side Validation
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null)
        {
            return new ValidationResult(FormatErrorMessage(null));
        }

        return ValidationResult.Success;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var modelClientValidationRule = new ModelClientValidationRule
        {
            ValidationType = "mustbefilled",
            ErrorMessage = ErrorMessage //Added
        };

        modelClientValidationRule.ValidationParameters.Add("param", metadata.DisplayName); //Added
        return new List<ModelClientValidationRule> { modelClientValidationRule };
    }
}

现在,如果规则失败,您还需要一个客户端脚本来执行操作。在您的情况下,您想要显示一个弹出窗口。将以下内容添加到您的站点脚本中,并确保在呈现Jquery-validation-*脚本后呈现它。

(function ($) {
    $.validator.addMethod('mustbefilled', function (value, element, params) {

        if ($(element).val() != '')
            return true;

        alert('Fill it first.');
        // Here you need to Invoke the modal popup.

        return false;
    }, '');

    $.validator.unobtrusive.adapters.add('mustbefilled', ['param'], function (options) {
        options.rules["mustbefilled"] = '#' + options.params.requiredif;
        options.messages['mustbefilled'] = options.message;
    });

})(jQuery);

要应用此自定义验证,请先在Model属性上添加该属性。

[MustBeFilled]
public string Keywords { get; set; }

然后将自定义javascript添加到bundle.config,前提是您已将代码保存在名为mustbefilled.js的单独文件中。在这里,我有意添加了带有验证插件的javascript文件,因此如果它在验证插件之前呈现,则不会出现异常。

        bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.validate*",
                  "~/Scripts/mustbefilled.js"));

这就是你所有的一切。

现在你要做的就是创建一个模型pop并在我放置注释的mustbefilled.js中调用它来调用它。请参阅此sample here,这将有助于您为关键字属性创建绑定模式弹出窗口。