设置属性不起作用

时间:2015-02-16 23:23:38

标签: c# asp.net-mvc

我正在开发一个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" } })

1 个答案:

答案 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);