我正在使用Asp.net MVC 4和.NET 4.5.
我有一张表,其中一列是十进制而不是空值.我使用MVC的脚手架模板为该表的实体框架创建的模型创建了一个剃刀视图.
现在,当我们在十进制属性的文本框中输入0或不输入任何内容(空)时,在服务器上它将变为0.
验证后,它在文本框中显示为零.
有什么方法可以用来识别客户是否在文本框中输入了零或空值,以便在回发后(如果有任何验证的情况下)客户获得他/她已过帐的值
更新1
public partial class Student
{
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public System.DateTime EnrollmentDate { get; set; }
public decimal RollNo { get; set; }
}
是EF生成的类.
而在我看来
@Html.TextBox("Students[0].RollNo", Model.Students[0].RollNo)
在我的模型中,此类的此列表是一个属性.
解决方法:
我建议使用如下所述的自定义验证属性:ASP.NET MVC: Custom Validation by Data Annonation
public class MyAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
int temp;
if (!Int32.TryParse(value.ToString(), out temp))
return false;
return true;
}
}
并使用[MyAttribute]装饰您的媒体资源
编辑:
由于空文本框提供的空值为零,只需将属性更改为可为空的double即可.这应该提交一个可以与零分隔的null.
public partial class Student
{
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public System.DateTime EnrollmentDate { get; set; }
public decimal? RollNo { get; set; }
}
编辑2:
由于您对模型没有影响,并且不想使用viewmodels和backupproperties,因此这是另一种方法:使用自定义modelbinder.
public class DoubleModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (string.IsNullOrEmpty(valueResult.AttemptedValue))
{
return double.NaN;
}
return valueResult;
}
}
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder());
}
如果提交的值为空,则将为您提供模型中恒定的double.NaN值.希望这可以帮助.