通过javascript更新的asp.net mvc禁用文本框不会发布新值

时间:2012-05-04 13:10:59

标签: asp.net-mvc asp.net-mvc-3

我正在使用强类型模型进行观察。我有一个禁用的文本框,其值我使用javascript更新。文本框使用此

呈现
<%: Html.TextBoxFor(model => model.TotalAmount, new { disabled = "disabled"})%>

这会将带有NAME和ID的文本框呈现为“TotalAmount”。 TotalAmount也是我的模型上绑定到此视图的属性。

在视图中更新其值的javascript在其函数中是这样的:

document.getElementById('TotalAmount').value = {assigning new value here};

该函数被调用,当我在另一个可编辑文本框中更改某个值时,我可以在禁用的文本框中看到该值。但是,当我将此表单发布到我的操作方法时,如下所示:

[HttpPost]
public ActionResult Process (ProcessVM FormPostVM)
{
}

已禁用的文本框属性[TotalAmount]仍具有旧值,但我修改的可编辑文本框包含我输入的新值。为什么禁用的文本框不包含javascript更新值?

我尝试使用

ModelState.Remove("TotalAmount");

在上面的动作方法中,但正如我已经认为它不起作用。

任何线索,提示?

谢谢你的时间......

5 个答案:

答案 0 :(得分:23)

HTML输入元素(例如具有disabled="disabled"属性的文本框在提交表单时永远不会将其值发送到服务器。如果您要将值发送到服务器,同时仍然禁止用户更改它,您可以创建文本框readonly

<%= Html.TextBoxFor(model => model.TotalAmount, new { @readonly = "readonly" }) %>

答案 1 :(得分:4)

禁用输入永远不会在表单提交中发送,请尝试使用readonly属性或隐藏输入

答案 2 :(得分:4)

禁用字段不会发布。尝试使用隐藏的表单字段将值发送到服务器,并设置TotalAmount和隐藏的表单字段。在服务器上,使用隐藏字段的值。

另一方面,由于这看起来像订单总数,这是我在服务器上重新计算的东西,而不是开放某人黑客入侵html并获得产品折扣的可能性。

修改 对于其他人来说,我忘记了readonly属性。那也行。

答案 3 :(得分:3)

如果您将其更改为使用readonly而不是disabled,那么这应该为您提供相同的功能,但会发布该值。

答案 4 :(得分:1)

正如您所发现的,浏览器不会在禁用的输入控件中发布值。解决此问题的最简单方法可能是挂钩表单提交,并在提交表单时重新启用输入;用户将无法编辑该值,并且应该使用剩余的请求发布。

我认为最后一个问题描述了它:请查看:

Retrieving the value of a asp:TextBox