我的视图为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有一些冲突;
答案 0 :(得分:3)
如果您正在使用htmlhelper,ValidationMessageFor会不会向用户显示验证摘要,则会向他/她显示您需要填写的所有字段?
e.g。
如果您有一个模型,并且您有多个需要归档的字段,可以通过使用[Required]
属性修改这些字段/属性或您认为合适的任何其他字段来验证,例如[StringLength]
等。
如果这样做,您可以提供验证摘要,如果不符合设置验证,则使用模型绑定器不发布您的数据。 验证摘要示例:
@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,这将有助于您为关键字属性创建绑定模式弹出窗口。