我使用的是Asp.net MVC 4和.NET 4.5。 我有一个表有一列十进制非空值。我使用MVC的脚手架模板创建了一个剃刀视图,该模型由该表的Entity框架创建。
现在,当我们在decimal属性的文本框中输入0或no(null)时,在服务器上它将变为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)
在我的模型中,这个类的列表是一个属性。
答案 0 :(得分:3)
我建议使用此处描述的自定义验证属性: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,这是另一种方法:使用自定义模型绑定器。
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值。希望这会有所帮助。
答案 1 :(得分:3)
十进制非空值[...]是否有任何方法可以识别客户端是否在文本框中输入零或空,以便在回发后,如果有任何验证,客户端获取他/她的值发布了
是的,通过使用具有 可空的十进制属性的ViewModel。您不应该将Entity Framework模型用作视图模型。
答案 2 :(得分:-1)
使用[Required]
和[DisplayFormat]
注释来限制用户在文本框中分别设置空值和格式化小数值。
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; }
[Required]
[DisplayFormat(DataFormatString = "{0:0.###}")]
public decimal RollNo { get; set; }
}
答案 3 :(得分:-1)
尝试这样做:
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
把这个放在里面:
@using (Ajax.BeginForm("Action", "Controller",null, new AjaxOptions{})
{
@for(int i=0;i<Model.Students.Count;i++)
{
@Html.TextBoxFor(c=>Model.Students[i].RollNo)
}
<input type="submit" value ="submit"/>
}
现在在您的模型上使用数据注释,您可以使用所需的标记或MIN,MAX等使您成为逻辑。
不要忘记在网络配置中设置ClientValidationEnabled=true
并将其包含在Layout jquery.unobtrusive-ajax.js
中。
这样做可以防止用户在模型无效的情况下提交表单!
如果您想拥有更多数据注释,只需安装包DataAnnotationsExtensions即可。 广告你将有更多有用的数据注释标签。 希望这会有所帮助。
注意: * Min,Max默认不包括在内,您可以使用DataAnnotationsExtensions。*