- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用带有C#和DataAnnotations的asp.net mvc 2。
情况是这样的:我有一个针对模型类强类型化的自定义控件。此控件在视图上显示了几次,但具有不同的属性值,例如标题(例如:问题1,问题2,问题3等都是标题)。我可以编写一个自定义的验证类来对整个对象进行验证,但是问题是,我无法显示特定的Html.ValidationMessage(...)标签。验证错误仅显示在视图顶部的摘要中,我希望它们显示在验证失败的特定控件的顶部和旁边。
我尝试创建像下面这样的自定义验证类,以逐个属性地进行验证,但是问题是我需要模型的两个值:Rating和Heading。实际业务验证是针对“等级”执行的,但“标题”属性向用户标识屏幕上哪个控件不正确。
[AttributeUsage(AttributeTargets.Property)]
public class RatingValidation : ValidationAttribute
{
public string Heading { get; private set; }
private readonly string ErrorRatingInvalid = "Rating for {0} is invalid. Rating is required and must be between 1 and 5.";
public override string FormatErrorMessage(string name)
{
String errorMsg = ErrorRatingInvalid;
return String.Format(CultureInfo.CurrentUICulture,
errorMsg,
Heading);
}
public override bool IsValid(object value)
{
bool isValidResult = true;
if (value == null)
return false;
//Trying to do something like the following. This doesn't work because the
//attribute is applied to a property so only that property value is passed.
//In this case, the type of myRatingObject would likely be the same as the
//property validated.
var myRatingObject = TypeDescriptor.GetProperties(value);
this.Heading = myRatingObject.Heading;
if( myRatingObject.Rating < 1 || myRatingObject.Rating > 5)
isValidResult = false;
return isValidResult;
}
}
public class MyModel
{
public MyModel()
{
//this.IsEditable = true;
}
public String Heading { get; set; }
[RatingValidation()]
public int Rating { get; set; }
}
[RatingsValidationAttribute()]
public class PersonRating
{
public String Heading { get; set; }
public int Index { get; set; }
public int Rating { get; set; }
}
public class Person
{
public String FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public List<PersonRating> Ratings { get; set; }
}
<%= Html.EditorFor(m => m.Ratings) %>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ModelBindingResearch.Models.PersonRating>" %>
<%= Html.HiddenFor(m=>m.Heading) %>
<%= Html.HiddenFor(m=>m.Index) %>
<%= Html.DisplayTextFor(model => model.Heading) %>
:
<%= Html.TextBoxFor(model => model.Rating) %>
<%= Html.ValidationMessageFor(model => model.Rating, "*")%>
<%= Html.ValidationMessageFor(m=>m) %>
<br />
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class RatingsValidationAttribute : ValidationAttribute
{
public RatingsValidationAttribute()
{
}
public int Rating { get; private set; }
public string Heading { get; set; }
private readonly string ErrorRatingInvalid = "Rating for {0} is invalid. Rating is required and must be between 1 and 5.";
public override string FormatErrorMessage(string name)
{
String errorMsg = ErrorRatingInvalid;
return String.Format(CultureInfo.CurrentUICulture,
errorMsg,
Heading);
}
public override bool IsValid(object value)
{
bool isValidResult = true;
PersonRating personRating = (value as PersonRating);
try
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
Heading = personRating.Heading;
if (personRating.Rating < 1 || //Rating must be b/t 1 & 5
personRating.Rating > 5)
{
isValidResult = false;
}
}
catch (Exception e)
{
//log error
}
return isValidResult;
}
}
public class TestModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Object o = base.BindModel(controllerContext, bindingContext);
Object obj = bindingContext.Model;
Person p = (Person)o;
bindingContext.ModelState.AddModelError("FirstName", "Custom exception thrown during binding for firstname.");
return o;
}
protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
String propertyName = propertyDescriptor.Name;
Object propertyValue = value;
}
private bool IsFormatException(Exception e)
{
if (e == null)
return false;
else if (e is FormatException)
return true;
else
return IsFormatException(e.InnerException);
}
}
public ActionResult Create()
{
return View(getPerson());
}
[HttpPost]
public ActionResult Create(Person p)
{
return View(p);
}
private Person getPerson()
{
Person p = new Person();
Address a = new Address();
PersonRating pr1 = new PersonRating();
PersonRating pr2 = new PersonRating();
PersonRating pr3 = new PersonRating();
pr1.Heading = "Initiative";
pr1.Rating = 5;
pr1.Index = 1;
pr2.Heading = "Punctuality";
pr2.Rating = 5;
pr1.Index = 2;
pr3.Heading = "Technical Knowledge";
pr3.Rating = 5;
pr3.Index = 3;
a.Street = "555 Somewhere Dr";
a.City = "City";
a.State = "AL";
p.FirstName = "Jason";
p.LastName = "Rhevax";
p.Age = 30;
p.PersonAddress = a;
p.Ratings.Add(pr1);
p.Ratings.Add(pr2);
p.Ratings.Add(pr3);
return p;
}
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<ModelBindingResearch.Models.Person>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Create
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Create</h2>
<% using (Html.BeginForm()) {%>
<%= Html.ValidationSummary() %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.FirstName) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.FirstName) %>
<%= Html.ValidationMessageFor(model => model.FirstName, "*") %>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.LastName) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.LastName) %>
<%= Html.ValidationMessageFor(model => model.LastName) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Age) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Age) %>
<%= Html.ValidationMessageFor(model => model.Age) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.PersonAddress.Street) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.PersonAddress.Street)%>
<%= Html.ValidationMessageFor(model => model.PersonAddress.Street)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.PersonAddress.City) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.PersonAddress.City)%>
<%= Html.ValidationMessageFor(model => model.PersonAddress.City)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.PersonAddress.State) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.PersonAddress.State)%>
<%= Html.ValidationMessageFor(model => model.PersonAddress.State)%>
</div>
<div>
<%= Html.EditorFor(m => m.Ratings) %>
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%= Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
ModelBinders.Binders.Add(typeof(Person), new TestModelBinder());
<%= Html.ValidationMessageFor(model => model.Rating, "*")%>
<%= Html.ValidationMessageFor(model => model)%>
最佳答案
等待MVC3。我是认真的。
目前,类范围的自定义验证属性的选项非常差,没有任何非常好的扩展点。您创建一个自定义ModelBinder几乎是费劲的,然后可以将其添加到ModelState来对验证属性进行任何复杂的操作。
像您将要使用的属性一样,然后检测从活页夹请求什么类型,通过Reflect查找属性,然后根据需要验证/添加到模型状态。
MVC 3解决了此问题,但直到那时您仍然无法创建自己的活页夹。
关于c# - 如何在asp.net MVC 2应用程序中的自定义ValidationAttribute内部访问其他属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3720823/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!