我无法获得我在控制器中发布的文本框中的值

时间:2014-02-12 11:46:39

标签: c# asp.net-mvc asp.net-mvc-4 razor

我使用的是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)

在我的模型中,这个类的列表是一个属性。

4 个答案:

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

MSDN Nullable Types

编辑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。*