【问题标题】:Textbox for Decimal value null when submitting form in ASP.Net?在 ASP.Net 中提交表单时,十进制值的文本框为空?
【发布时间】:2023-03-05 01:51:01
【问题描述】:

提交表单时的文本框值在控制器中为空。我所拥有的简化结构如下:

型号

public class MyObject
{
    public decimal? DecimalProperty { get; set; }
}

查看

@model List<MyObject>

@for(var i = 0; i < Model.Count; i++) 
{
   using (Html.BeginForm("UpdateObject", "MyController", FormMethod.Post))
   {
      @Html.Textbox(String.Format("Model[{0}].DecimalProperty", i), Model[i].DecimalProperty)
      <input type="submit" value="Update"/>
   }
}

控制器

public ActionResult UpdateObject(MyObject myObject)
{
   // Do Stuff...
}

如果我在控制器方法中放置断点,然后检查 myObject 的属性值,则 DecimalProperty 为空。我正在使用的实际对象上还有其他属性,这些属性很好,但由于某种原因,这个属性不是。我没有发现任何暗示必须以不同于 DateTime 或字符串的方式处理小数的内容。我也试过手动写出输入的html:

 <input type="text" name="@(String.Format("Model[{0}].DecimalProperty", i))" value="@Model[i].DecimalProperty" />

为了安全起见,我已经设置了文本框的 nameid 属性。关于我提交表单时为什么我的文本框值为空的任何想法?

设置 [HttpPost] 属性没有帮助。

【问题讨论】:

  • 您看到有一个模型列表,这是为什么呢?如果您在视图上有一个枚举器,但在操作上只有一个对象,我不确定模型绑定器是否会弄清楚该怎么做。
  • 在视图上我的模型是一个对象列表。视图上还有多种形式(每个对象一个)。 Model[i] 表示模型中的特定元素。
  • 将其编辑到视图代码块中。
  • 试试“十进制?”您必须考虑可能的 null 值。
  • 但是如果我在文本框中输入了一个值,那么当我提交表单时它在控制器中不应该为空。但是,是的,该属性实际上是一个小数?我将进行编辑以反映这一点。

标签: c# asp.net forms razor


【解决方案1】:

问题在于您的操作签名。 您应该将其更改为接受整个模型列表,或者将 Html.TextBox 的 Name 属性更改为 MyObject 的属性名称,因为默认的 MVC binder 无法正确映射它。

所以,第一个选项:

public ActionResult UpdateObject(List<MyObject> myObject)
{
   // Do Stuff...
}

第二个选项:

@Html.Textbox("DecimalProperty", Model[i].DecimalProperty)

【讨论】:

  • 我实际上只是尝试过(从文本框名称中删除 Model[i])并且它有效。太棒了!
  • @Nick 这就是我一直在告诉你的 :)
  • 是的,我不明白你在早期的 cmets 中说什么,@AndreCalil。那是我的失败。
  • @Nick 或者我没有正确解释 :) 无论如何,很高兴它现在正在工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多