问题是,如果我使用。rsx文件(参考资料)提供自定义错误消息,那么在ApiController中,ModelState.isValid总是true。
null
public class LoginModel
{
public string Email { get; set; }
[Required]
[MinLength(5)]
public string Password { get; set; }
}
apicontroller中的方法:
[HttpPost]
[ModelValidationFilter]
public void Post(LoginModel model)
{
var a = ModelState.IsValid;
}
和过滤器:
public class ModelValidationFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
我要以POST请求的方式发送这个:
{ Email: "asd@asd.com", Password: "a" }
ModelState.IsValid为false,响应与预期相同:
{
"Message": "The request is invalid.",
"ModelState":
{
"model.Password":
[
"The field Password must be a string or array type with a minimum length of '5'."
]
}
}
但是如果我使用验证属性中的资源(配置为公共和嵌入资源构建操作):
public class LoginModel
{
public string Email { get; set; }
[Required]
[MinLength(5, ErrorMessageResourceName = "Test", ErrorMessageResourceType = typeof(Resources.Localization))]
public string Password { get; set; }
}
('test'key仅保存'test'字符串值)ModelState.IsValid为true。
Resources类是可见的,resharper正确验证ErrorMessageResourceName中提供的字符串。
我尝试了您的解决方案,但我不理解类资源。它是从哪里来的?我的解决方案如下所述,它与良好的资源一起工作。
型号:
using TestApp.Properties;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace TestApp.Models
{
public class LoginModel
{
public string Email { get; set; }
[Required]
[MinLength(5, ErrorMessageResourceName="Test", ErrorMessageResourceType=typeof(Resources))]
public string Password { get; set; }
}
}
ModelValidationFilterAttribute:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Net.Http;
namespace TestApp.Controllers
{
public class ModelValidationFilterAttribute: ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
}
两个资源文件,一个是常规的resources.resx,包含字符串key/value test/something;另一个是resources.de-de.resx,包含字符串key/value test/something_de。
我用fiddler发了这个:
Header:
User-Agent: Fiddler
Host: localhost:63315
Content-Length: 37
Content-Type: application/json
正文:
{Email:"text@test.com", Password:"a"}
null
HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcV29ya1xDU1xGYkJpcnRoZGF5QXBwXEZiQmRheUFwcDJcYXBpXGxvZ2lu?=
X-Powered-By: ASP.NET
Date: Fri, 28 Jun 2013 14:56:54 GMT
Content-Length: 83
{"Message":"The request is invalid.","ModelState":{"model.Password":["something"]}}
对于de-DE,请求头为:
User-Agent: Fiddler
Host: localhost:63315
Content-Length: 37
Accept-Language: de-DE
Content-Type: application/json
答复是:
HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcV29ya1xDU1xGYkJpcnRoZGF5QXBwXEZiQmRheUFwcDJcYXBpXGxvZ2lu?=
X-Powered-By: ASP.NET
Date: Fri, 28 Jun 2013 14:57:39 GMT
Content-Length: 86
{"Message":"The request is invalid.","ModelState":{"model.Password":["something_DE"]}}
如您所见,从本地化资源文件读取消息时,消息带有“_DE”。
这是你想要实现的吗?
亲切的问候。
编辑:路由配置为
config.Routes.MapHttpRoute(
name: "LoginRoute",
routeTemplate: "api/login",
defaults: new { controller = "Login", action = "PostLogin" },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }
);
Web.config添加了下一节:
<system.web>
...
<globalization culture="auto" uiCulture="auto" />
...
</system.web>
问题内容: 当选择menuItem时,尝试关闭当前场景并打开另一个场景时出现问题。我的主要阶段编码如下: 执行该程序后,它将转到cartHomePage.fxml。选择菜单项后,我可以从那里选择创建产品或创建类别。这是我的动作事件: 但是,我只能切换一次舞台。例如,我的默认页面是cartHomePage.fxml。运行程序时,首先要创建产品阶段。在那之后,我不能再去任何地方了。错误消息是: 我关上
问题内容: 我是Django表单,它可以检查表单是否有效: 但是我错过了如果无效的怎么办?如何返回带有错误消息的表格?我没有在任何示例中看到“其他”。 问题答案: 如果在表单无效时呈现相同的视图,则可以在模板中使用来访问表单错误。 一个例子:
我想把我的spring web应用程序替换成使用spring boot的版本,并拥有不同于常规的web-app目录。(src/main/webapp->src/main/其他名称) Before:它具有默认servlet的servlet上下文配置。
此功能需要安装信息模型后方可显示使用 一、本功能说明 本功能主要是针对信息模型功能参数的相关配置 二、具体说明 1.信息模型所管理的联动菜单ID,详情查看菜单管理 2.前台数据查询结果的缓存时间,0为不缓存,推荐配置为60。 3.设置为“是”则前台联系方式以图片形式显示。开启此功能可以防止您的网站用户信息被采集,如图: 4.设置为“是”则启用多城市版分类信息 5.此处填写您在栏目中添加的如“房产”
当选择menuItem时,尝试关闭当前场景并打开另一个场景时,我遇到了问题。我的主阶段编码如下: 当程序执行时,它将转到carthomepage.fxml。从那里,我可以选择去创建产品或创建类别时,菜单项被选中。下面是我的操作事件: 提前道谢。
上面的配置是为了让消息在30秒内不过期。但是消息在到达队列后立即过期。侦听器甚至不接收消息。