编辑:将此问题升级到MVC 2.0
使用asp.net MVC 2.0是否存在创建验证摘要的现有方法,该方法对包含集合的模型有意义?如果没有,我可以创建自己的验证摘要
示例型号:
public class GroupDetailsViewModel
{
public string GroupName { get; set; }
public int NumberOfPeople { get; set; }
public List<Person> People{ get; set; }
}
public class Person
{
[Required(ErrorMessage = "Please enter your Email Address")]
[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "Please enter a valid Email Address")]
public string EmailAddress { get; set; }
[Required(ErrorMessage = "Please enter your Phone Number")]
public string Phone { get; set; }
[Required(ErrorMessage = "Please enter your First Name")]
public …Run Code Online (Sandbox Code Playgroud) 我目前正在使用ASP.NET登录控件.我可以设置自定义失败文本,如果登录失败,我可以在显示失败文本的页面上添加文字.我还在页面上有一个验证摘要,我收集了所有可能发生的错误(目前它只是验证用户输入了登录名和密码.
如果我可以将登录控件的失败文本添加为验证摘要中的项目,那将是非常好的,但我不确定这是否可能?
希望stackoverflow的大量智能可以给我一些指示?
谢谢!
/ Thomas Kahn PS.我在C#中编码.
这是一个与已发布的问题非常相似的问题:ASP.NET MVC:在TryUpdateModel中设置的验证消息未显示ValidationSummary
我不确定那个旧主题是否参考了早期版本的MVC,但在MVC3中,我遇到了类似行的奇怪行为.
我有一个名为Trade的模型类.它继承自IValidatableObject,因此实现了Validate方法.在此范围内,我们对模型进行了整体验证(与强制验证属性的数据注释相对).验证如下:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var validationResults = new List<ValidationResult>();
if (this.EndDate < this.StartDate)
{
validationResults.Add(new ValidationResult("End date must be greater than start date"));
}
return validationResults;
}
Run Code Online (Sandbox Code Playgroud)
我们有一个视图模型来帮助显示交易.这包含通过TradeModel属性对交易模型的引用.所以基本上,视图模型是一个交易模型,加上一些额外的信息,用于下拉列表的比例,例如交易对手等.
我们的CSHTML类包含一个ValidationSummary,其中"true"作为参数,这意味着它只显示模型错误.
如果我实现我的HttpPost控制器方法来创建一个新的贸易如下...
[HttpPost]
public ActionResult Create(FormCollection collection)
{
var trade = new Trade();
if (this.TryUpdateModel(trade))
{
if (this.SaveChanges(this.ModelState, trade))
{
return this.RedirectToAction("Index");
}
}
return this.View(trade);
}
Run Code Online (Sandbox Code Playgroud)
...当我使用StartDate> EndDate进行交易时,我发现TryUpdateModel返回false并且用户被定向回他们的交易.这看似合乎逻辑.不幸的是ValidationSummary没有显示任何错误消息.
如果我在Create方法中放置一个断点并调查ModelState,我可以看到字典中有一条错误消息.它违反了"TradeModel"的密钥,而不是针对任何属性.再次,这似乎合乎逻辑.
关于其原因的一个理论是ValidationSummary假定针对非String.Empty的键的任何验证错误必须是属性验证错误,它忽略了我们的验证错误,因为我们有一个包含对模型的引用的视图模型,因此导致Key成为"TradeModel".
这个理论脱离水的原因是:如果我重写控制器的Create函数如下......
[HttpPost]
public ActionResult Create(Trade trade, FormCollection collection)
{
if (this.SaveChanges(this.ModelState, trade))
{
return this.RedirectToAction("Index"); …Run Code Online (Sandbox Code Playgroud) 我的模型(A类)有一个B类属性(称为b)并已IValidatableObject实现.
视图已经有了 @Html.ValidationSummary(true)
在验证摘要中,我想排除与属性相关的错误.在B类IValidatableObject实现中返回ValidationResult没有memberNames
但是IValidatableObject由于B类是A类的属性,因此不会显示B类的Valiadtion错误
如何显示B类非属性验证错误?
我在页面上有两个表单,每个表单都有自己的表单ValidationSummary.问题是,然后one form对both ValidationSummary显示验证消息执行服务器端验证.是否可以ValidationSummary在同一页面上有两个并ValidationSummary为其分配的每个表单执行?
@Html.ValidationSummary() 在Ajax.BeginForm表单中使用是否有任何问题?
我有以下场景,我无法获得必填字段的验证.表单刚刚发布,也没有错误.
这是视图:
@using (Ajax.BeginForm("Register", "Account", new AjaxOptions { HttpMethod = "POST", OnSuccess = "closeDialog('RegistroUsuario')" }))
{
@Html.ValidationSummary()
<fieldset>
<legend>Cadastro novo Usuário</legend>
<table id="changePassword">
<tr>
<td class="smallField">Username:</td>
<td>@Html.TextBoxFor(m => m.UserName)</td>
</tr>
<tr>
<td>Password:</td>
<td>@Html.PasswordFor(m => m.Password)</td>
</tr>
<tr>
<td>Repetir Senha:</td>
<td>@Html.PasswordFor(m => m.ConfirmPassword)</td>
</tr>
<tr>
<td>Email:</td>
<td>@Html.TextBoxFor(m => m.Email)</td>
</tr>
<tr>
<td>Pergunta Secreta:</td>
<td>@Html.TextBoxFor(m => m.SecretQuestion)</td>
</tr>
<tr>
<td>Resposta:</td>
<td>@Html.TextBoxFor(m => m.SecretQuestionPassword)</td>
</tr>
<tr>
<td>Ativo:</td>
<td><input type="checkbox" name="status" id="status" value="Ativo"></td>
</tr>
</table>
</fieldset>
<input type="submit" value="Criar Usuário" …Run Code Online (Sandbox Code Playgroud) 我有一个使用asp-validation-summary. 因此,内联style被添加到我页面中的 HTML 元素中。
当我运行我的应用程序时,这在控制台(Chrome v78.0.3904.108)中给了我以下错误:
拒绝应用内联样式,因为它违反了以下内容安全策略指令:“style-src 'self' https://fonts.googleapis.com ”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-aqNNdDLnnrDOnTNdkJpYlAxKVJtLt9CtFLklmInuUAE=')或随机数(“nonce-...”)。
所以我将哈希添加到我的 CSP 中,现在看起来像这样:
style-src 'self' https://fonts.googleapis.com 'sha256-aqNNdDLnnrDOnTNdkJpYlAxKVJtLt9CtFLklmInuUAE=';
Run Code Online (Sandbox Code Playgroud)
当我加载我的页面时,我仍然收到类似的错误:
拒绝应用内联样式,因为它违反了以下内容安全策略指令:“style-src 'self' https://fonts.googleapis.com 'sha256-aqNNdDLnnrDOnTNdkJpYlAxKVJtLt9CtFLklmInuUAE='”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-aqNNdDLnnrDOnTNdkJpYlAxKVJtLt9CtFLklmInuUAE=')或随机数(“nonce-...”)。
这是整个 CSP 标头:
X-Content-Security-Policy: default-src 'self'; object-src 'none'; frame-ancestors 'none'; sandbox allow-forms allow-same-origin allow-scripts; base-uri 'self'; upgrade-insecure-requests; style-src 'self' https://fonts.googleapis.com 'sha256-aqNNdDLnnrDOnTNdkJpYlAxKVJtLt9CtFLklmInuUAE='; font-src 'self' https://fonts.gstatic.com;
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我已经添加了哈希,正如错误中所暗示的那样。它似乎也是一个有效的 header。
但为什么这不起作用?
我想在ASP.NET MVC 2中自定义ValidationSummary的html输出
从
<div class="validation-summary-errors">
<span>Oops! validation was failed because:</span>
<ul>
<li>The Title field is required.</li>
<li>The Body field is required.</li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
至
<div class="validation-error">
<p>Oops! validation was failed because:</p>
<ul>
<li>The Title field is required.</li>
<li>The Body field is required.</li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
asp.net MVC 2有什么新方法可以解决这个问题吗?
嗨我正在使用自定义表单字段验证器,似乎自定义验证器正在工作,不允许它继续到下一页,但它不更新验证摘要也不显示星号和标签,我已经变得可见了.我还在同一个字段上有其他验证器,如RequiredFieldValidator.设置了我的ValidationGroup,Text和IsValid也是如此.我甚至在javascript中编写并设置了一个虚拟客户端验证方法,正如一些解决方法所暗示的那样.
这是asp.net中的验证摘要代码
<asp:ValidationSummary ID="ValidatorSummary" runat="server" ValidationGroup="Step2" />
Run Code Online (Sandbox Code Playgroud)
这是自定义验证器和必填字段
<asp:CustomValidator ID="AddressVerification" runat="server" ErrorMessage="Please enter a valid address." Display="Dynamic" ValidationGroup="Step2" OnServerValidate="AddressVerification_ServerValidate" ClientValidationFunction="CustomValidatorDummy" Text="*" Enabled="true" EnableClientScript="true"></asp:CustomValidator>
<asp:RequiredFieldValidator ID="RFValidatorHomeAddress" runat="server" ErrorMessage="Please enter home address." Text="*" Display="Dynamic" ValidationGroup="Step2" ControlToValidate="txtHomeAddress"></asp:RequiredFieldValidator>
Run Code Online (Sandbox Code Playgroud)
这是后面代码中的自定义验证方法
protected void AddressVerification_ServerValidate(object sender, ServerValidateEventArgs e)
{
//lets just say it doesn't validate and sets the IsValid to false
lblUspsValidatorResHomeCity.Visible = true;
lblUspsValidatorResHomeState.Visible = true;
lblUspsValidatorResHomeZip.Visible = true;
e.IsValid = false;
}
Run Code Online (Sandbox Code Playgroud)
请指教,谢谢.
编辑:回答 - 按照bitxwise提到.验证摘要也应放在更新面板中.谢谢!
像这样:
<asp:UpdatePanel ID="UpdatePanelValidationSummaryHome" ChildrenAsTriggers="false" UpdateMode="Conditional"
runat="server">
<ContentTemplate>
<asp:ValidationSummary ID="AddressHomeValidationSummary" …Run Code Online (Sandbox Code Playgroud) 有没有办法自定义validationSummary,以便它可以输出锚标记,其HREF是摘要中验证消息显示的字段的名称?这样,使用 jquery,我可以添加 onclick 事件,当在验证摘要上单击锚标记时,这些事件会聚焦于该字段。
这主要针对视障人士,这样当他们出现错误时,验证摘要会聚焦,他们会选择错误条目,带有字段标签的锚点标签会聚焦,屏幕阅读器会先读取锚点,然后读取消息,然后他们可以单击聚焦在错误的字段上。
<a href="#First_Name">名字</a> - 请输入您的名字。
谢谢。
我想在验证摘要中显示带有成功图像(绿色勾号)和失败图像(红色警告)的错误消息.这该怎么做.和我验证摘要我将不得不显示一些粗体,斜体等文本,因为我试图传递这样的字符串.
inValid <b>username</b> or <b>password</b>
Run Code Online (Sandbox Code Playgroud)
但在页面中它的渲染就是这样.它没有以粗体显示用户名和密码.有没有办法做到这一点.我在控制器中收到此验证错误消息并将其添加到ModelState.add(错误);
如果两个文本框一次验证失败,则ValidationSummary会两次显示相同的消息.
难道我做错了什么?或者是否有一个设置我可以更改以隐藏重复的消息?
我把它分解为最简单的例子:
视图:
@model MyModel
@Html.ValidationSummary()
@Html.TextBoxFor(model => model.A)
@Html.TextBoxFor(model => model.B)
Run Code Online (Sandbox Code Playgroud)
模型:
public class MyModel : IValidatableObject
{
public int A { get; set; }
public int B { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
//Some logic goes here.
yield return new ValidationResult("Validation failed", new[] { "A", "B" });
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
