我正在将一个对象从客户端传递给服务器.在此过程中,表示为string.empty的对象的属性将转换为null.当对象类型支持string.empty时,我想知道如何防止这种情况.

console.log("DataToPost:", dataToPost);
$.ajax({
type: "POST",
contentType: 'application/json'
url: "../../csweb/Orders/SaveOrderDetails/",
data: dataToPost,
success: function (result) {
console.log(result);
},
error: function (e) {
console.error(e);
}
});
Run Code Online (Sandbox Code Playgroud)

我的模型包含可空的DateTime对象.我不能强制服务器上的所有空值到string.empty.
我正在使用AutoMapper,所以我不想在服务器上单独检查属性.
当我使用UpdateModel或TryUpdateModel时,MVC框架足够聪明,可以知道您是否尝试将null传入值类型(例如,用户忘记填写所需的Birth Day字段).
不幸的是,我不知道如何覆盖默认消息"需要一个值".在总结中更有意义的事情("请输入您的出生日").
必须有一种方法可以做到这一点(没有编写过多的解决方法),但我找不到它.有帮助吗?
编辑
此外,我想这也是无效转换的问题,例如BirthDay ="Hello".
我有一个接受几个参数的ApiController方法,如下所示:
// POST api/files
public HttpResponseMessage UploadFile
(
FileDto fileDto,
int? existingFileId,
bool linkFromExistingFile,
Guid? previousTrackingId
)
{
if (!ModelState.IsValid)
return Request.CreateResponse(HttpStatusCode.BadRequest);
...
}
Run Code Online (Sandbox Code Playgroud)
当我发布POST时,我将FileDto对象放在请求的正文中,并将其他参数放在查询字符串上.
我已经发现我不能简单地省略可以为空的参数 - 我需要将它们放在带有空值的查询字符串上.所以,当我不想为可空参数指定值时,我的查询看起来像这样:
http://myserver/api/files?existingFileId=&linkFromExistingFile=true&previousTrackingId=
Run Code Online (Sandbox Code Playgroud)
这与我的控制器方法匹配,并且当执行该方法时,可以为空的参数null(正如您所期望的那样).
但是,对ModelState.IsValid返回的调用false,当我检查它们时,它正在抱怨两个可以为空的参数.(模型的其他位没有错误).消息是:
值是必需的,但请求中不存在.
为什么它认为价值是必需的/不存在的?当然(a)中的值不要求可为空的,和(b)的值是(排序的)本-中的一种方式的空杂交排序?
我在一个全新的MVC Web API项目中重现了我遇到的问题.
这是默认代码,略有修改.
public string Get(int? id, int? something = null)
{
var isValid = ModelState.IsValid;
return "value";
}
Run Code Online (Sandbox Code Playgroud)
如果你去,http://localhost/api/values/5?something=123那么这很好,isValid是true.
如果你去http://localhost/api/values/5?something=那么isValid是false.
我遇到的问题是,如果为可以为空的项提供null或省略的值,ModelState.IsValid会标记验证错误 "A value is required but was not present in the request."
ModelState字典也如下所示:
有两个条目something,一个可以为空,我不确定它是否重要.
知道如何解决这个问题,以便在省略可空参数或提供为null时模型是有效的吗?我在我的web api中使用模型验证,如果每个带有可为空参数的方法都会产生模型错误,它就会破坏它.