【问题标题】:I am not able to get the value in textbox which i have posted in controller我无法获取我在控制器中发布的文本框中的值
【发布时间】:2014-02-12 11:46:39
【问题描述】:

我正在使用 Asp.net MVC 4 和 .NET 4.5。 我有一个表,其中一列是十进制而不是空值。我使用 MVC 的脚手架模板为实体框架为该表创建的模型创建了一个剃刀视图。

现在,当我们在十进制属性的文本框中输入 0 或空值(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)

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

【问题讨论】:

  • 您是如何尝试读取该文本框的值的?是通过javascript吗?还是您在提交表单后尝试阅读它?仅凭您发布的代码很难判断您的问题是什么。
  • 我有 mvc 的 html.beginfrom 方法。 MVC 的默认模型绑定器读取值并分配给模型

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


【解决方案1】:

我建议使用此处描述的自定义验证属性: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?。这应该提交一个可以与零分开的空值。

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:

由于您对模型没有影响并且不想使用视图模型和备份属性,因此这里有另一种方法:使用自定义模型绑定器。

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 值。希望这会有所帮助。

【讨论】:

  • 您的代码将限制为零。在我的情况下,允许 0,但不允许提交保持文本框为空
  • 你可以绑定到一个额外的字符串属性。如果文本框为空,则提交“”。 Int32.TryParse 将失败。
  • 但这将使我在 DB 列上维护两个字段。即,当我检索数据时,我需要将其分配给备份字符串属性,而当我保存数据时,我需要获取字符串值并将其分配给原始十进制值。那很乏味。我需要一些更好的解决方案。
  • 您可以定义自己的“无效”值。选择 -1 或其他任何值并使用 -1 创建一个 const 字段。从上下文中我猜 -1 不是 RoleNo 的有效值
  • 选择 decimal.MinValue 考虑 null 和工作。标记为答案
【解决方案2】:

十进制非空值 [...] 有什么方法可以识别客户端在文本框中输入的值是零还是空,以便在回发后,如果有任何验证,客户端会得到他/她的值已发布

是的,通过使用具有 可以为空的小数属性的 ViewModel。无论如何,您不应该将实体框架模型用作视图模型。

【讨论】:

  • 确实如此,而且效果也很好,但是我不想在检索数据和每次保存数据时都进行模型和视图模型的对话。因此我选择直接使用模型。有没有其他方法可以解决这个问题?
  • @haji 我不知道。关键是您的控制器不知道用户输入的 0 和默认十进制值 0 的区别。这可能在活页夹中知道,然后查看@csteinmueller 的回答:如果将值设置为double.NaN(一个特殊值)返回,则输入为空,因此您不会更新记录。
  • 我们有像 NaN 这样的十进制数吗?
  • @csteinmueller 有一个很好的答案,如果它支持十进制,这正是我想要的。现在这个 NaN 引起了问题:(
【解决方案3】:

使用[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; }
}

【讨论】:

  • 十进制不能为空,除非您指定为空。
  • 正如@RonaldEstacion 所说的decimal 不能为null,当我发布0 或null 时,MVC 模型绑定器会将其更改为0。
  • @RonaldEstacion 你对此有什么想法吗?
【解决方案4】:

尝试这样做:

<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.*

【讨论】:

  • 我不需要最小和最大验证。我关心的是区分零和空值。
  • 这很简单,让你的元素可以为空。所以在控制器中,当这个 si 为 null 时,你将收到 null,当 this 为 0 时,你会收到 0
  • 我无法控制模型,因为它是由实体框架生成的。而且我无法将我的 DB 列更改为可为空,因为它也被其他应用程序使用
  • 这应该对您有所帮助,因为可空的十进制类型默认不是 0 ,而是 null!希望这对您有所帮助。
  • 这不是使用域对象的好技术。 Mvc 是模型视图控制器结构,而不是域视图控制器。因此,使用 MVC,您可以根据需要创建模型并从域映射模型,因此您不需要在数据库中使其为空,并且在 POST 之后,您需要从模型执行域映射对象并将其保存到数据库。
猜你喜欢
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
相关资源
最近更新 更多