【问题标题】:Value from hidden field is not being passed to the EF context model隐藏字段中的值未传递到 EF 上下文模型
【发布时间】:2012-12-12 23:29:16
【问题描述】:

我使用 Razor 在表单的一些隐藏字段中输入了一些值。当我提交表单时,它没有通过实体框架在某个字段的context.tt 模型中创建的验证。当我提交时,会抛出一个错误,指出该字段不能为空。这让我相信 HTML 中的值是 null。当我检查来源时,这是我发现的:

<input Value="1" data-val="true" data-val-number="The field PoolType must be a number." id="PoolType" name="PoolType" type="hidden" value="" />
<input Value="Not Complete" id="LoanStatus" name="LoanStatus" type="hidden" value="" />
<input Value="2012-12-12 09:26.39" data-val="true" data-val-required="The DateStamp field is required." id="DateStamp" name="DateStamp" type="hidden" value="" />

我想知道为什么 ID 为 LoanStatusinput 设置了一个值,但它抛出一个错误,说它不能为空。抛出的异常是:

System.Data.ConstraintException 此属性不能设置为空值。

为了在 HTML 中设置值,我使用 ViewBag 在控制器中设置它,ViewBag.LoanStatus = "Not Complete";。然后在cshtml文件中@Html.HiddenFor(model =&gt; model.LoanStatus, new { @Value = ViewBag.LoanStatus })

有什么我遗漏的吗,我是 MVC 和实体框架的新手。

编辑 - 附加代码 更多隐藏元素

@Html.HiddenFor(model => model.ID, new{ @Value = ViewBag.ID })
        @Html.HiddenFor(model => model.Reason, new{ @Value = ViewBag.Reason })
        @Html.HiddenFor(model => model.PoolType, new{ @Value = ViewBag.PoolType })
        @Html.HiddenFor(model => model.LoanStatus, new{ @Value = ViewBag.LoanStatus })
        @Html.HiddenFor(model => model.DateStamp, new{ @Value = ViewBag.DateTime })

以及生成的html

<input Value="55" data-val="true" data-val-number="The field ID must be a number." data-val-required="The ID field is required." id="ID" name="ID" type="hidden" value="" />
        <input Value="1" data-val="true" data-val-number="The field Reason must be a number." id="Reason" name="Reason" type="hidden" value="" />
        <input Value="1" data-val="true" data-val-number="The field PoolType must be a number." id="PoolType" name="PoolType" type="hidden" value="" />
        <input Value="Not Complete" id="LoanStatus" name="LoanStatus" type="hidden" value="" />
        <input Value="2012-12-12 10:00.46" data-val="true" data-val-required="The DateStamp field is required." id="DateStamp" name="DateStamp" type="hidden" value="" />

在没有 Html 帮助器的情况下编辑代码 来自 .cshtml 文件的行 &lt;input type="hidden" name="LoanStatus" id="LoanStatus" data-val="true" value="@ViewBag.LoanStatus" /&gt;

来自 html 源代码的行 <input type="hidden" name="LoanStatus" id="LoanStatus" data-val="true" value="Not Complete" />

【问题讨论】:

  • 可以显示动作方法代码吗?
  • 为什么该行中有两次“Value”?
  • @vtortola 你的意思是在 context.tt 中进行验证的方法吗?

标签: c# .net asp.net-mvc-3 entity-framework-4


【解决方案1】:

当使用@Html.HiddenFor 时,输入的值是从您的模型对象中读取的。您尝试通过为Value 属性指定一个值来覆盖它。我想这行不通,如您所见,您会得到空值属性。

要解决您的问题,请不要使用 viewbag,而是将具有设置值的模型对象传递给您的视图,如下所示:

控制器:

return View(new YourModel { LoanStatus = "Not Complete" });

查看:

@Html.HiddenFor(m => m.LoanStatus)

【讨论】:

  • 当我在视图中为模型创建新记录时,这会起作用吗?
  • 我不明白你想要达到什么目的。视图的职责只是渲染一些 HTML。数据由控制器操作提供。
  • 我的意思是我没有完整的模型要传递,视图应该收集数据来创建模型记录。但是当我重新阅读您在做什么并且您正在创建一个填充了某些值的新模型然后将其传递给视图时。这行得通,谢谢。
  • 通常,您的控制器操作方法负责生成显示视图所需的模型数据。
【解决方案2】:

与其在此处使用 Html 帮助程序,不如尝试如下手动制作该行:

&lt;input type="hidden" name="LoanStatus" value="@ViewBag.LoanStatus"/&gt;

我仍然不知道为什么您的每一行都在 2 个地方设置了值。你能发布更多代码吗?

编辑:我认为小写值正在传递回您的控制器。尝试改用 @value(小写 v),看看是否能解决问题。

【讨论】:

  • 我只指定Value(大写V)。在生成 HTML 并将其发送到客户端时添加值
  • 在我看来,值(小写的 v)是被传回的值,它是空的。
  • 我尝试将@value@Value 相对应,但这也不起作用。值未在 html 中设置
  • 在这种情况下,试试我上面写的手动创建行而不是依赖 HTML 助手。
  • 我还尝试了您不使用 Html 助手的想法。该值是在 html 中设置的,但它仍然抛出关于值为 null 的相同错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多