我正在开发一个ASP.NET MVC 5(5.2.2)应用程序,其中我有一个模型:
public class MyModel{
private String _Password;
[Required]
[StringLength(int.MaxValue, MinimumLength=6)]
[DataType(DataType.Password)]
public string Password {
get
{
return Shell.ToolBox.Cryptography.GetMD5(_Password);
}
set {
_Password = value; // This is not called
}
}
}
_Password
的值始终为null,当我将此属性更改为自动类型问题时,问题就解决了。有什么不对,我使用了一个断点,甚至没有达到set方法。
查看:
<br />
@Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label" })
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
答案 0 :(得分:1)
@Blorgbeard透露了解决方案。请参阅以下模型:
public class Dummy
{
private string _field;
[Required]
[StringLength(int.MaxValue, MinimumLength=6)]
[DataType(DataType.Password)]
public string Field
{
get
{
if (_field == null)
{
throw new ArgumentNullException("Argh!");
}
return Utils.ByteArrayConverter.ByteArrayToString(
MD5CryptoServiceProvider.Create(_field).Hash);
}
set
{
_field = value;
}
}
}
我添加了对null
(抛出异常)的检查,以模拟如果MD5哈希函数无法处理空值参数会发生什么。果然,页面的行为就好像Field
始终为空,调试窗口记录ArgumentNullException
。在您的情况下,我们仍然可以使用Shell.Toolbox
版本,但我们只需要先检查null:
var pwd = _Password;
if (pwd == null)
{
pwd = string.Empty;
}
return Shell.ToolBox.Cryptography.GetMD5(pwd);