在 C# MVC 应用程序中,是不是可以在未更改的控件中从网页提交变量?

Posted

技术标签:

【中文标题】在 C# MVC 应用程序中,是不是可以在未更改的控件中从网页提交变量?【英文标题】:In a C# MVC app is it possible to submit variables from a web page in controls that did not change?在 C# MVC 应用程序中,是否可以在未更改的控件中从网页提交变量? 【发布时间】:2013-04-23 07:54:34 【问题描述】:

我的page.cshtml 文件中有一个C# MVC 应用程序和一个<form>。在那种形式中,我有 <input type="text" ... /> 元素。如果我提交此表单,我只会从我手动更改值的输入中获取 Response.ParamsResponse.Form 中的值(即输入文本框然后输入一些内容)。

如果我使用 jQuery 更改值,$('#myInput').val('some value'); 这不会算作输入值的更改,并且我在提交表单时没有得到 myInput 的值。

有什么方法可以确保提交所有输入?如果没有,那么是否有一个很好的解决方法,也许在我的模型绑定之前发生的某些事件?我需要知道提交时表单中的所有输入值是否更改。

一些附加信息:

表单和其他值已正确提交,当在我的控制器中调用 POST 操作时,我正在接收我的模型。

真正的问题是我的模型何时被绑定。正在创建它并与所有值绑定,但未提交的值除外,因为它不在Request.Params 集合中。

【问题讨论】:

这不应该发生。向我们展示您的 HTML。 只需接受模型作为 Action 的参数,您就可以按原样使用。 奇怪,我从来没有见过这个。它总是发布价值,不管它们是如何改变的,或者它们是否完全改变了 您是否在 Fiddler 中查看过值是如何提交的? 实际上我似乎记得禁用字段导致它们无法发布,你这样做吗? 【参考方案1】:

我只在禁用字段时看到过这种行为。因此,我通常有一个 javascript 函数来处理表单提交并在提交时重新启用它们,这样正确的值就会发送到服务器。

这样的东西对我有用(注意:我使用的是 JQuery):

$(document).ready() 
    $("#ButtonSubmit").click(SubmitForm);


function SubmitForm(e) 
    e.preventDefault();

    //ensure fields are enabled, this example does text and checkbox types
    $("[type='text']").attr("disabled", false);
    $("[type='checkbox']").attr("disabled", false);

    //submit the form
    document.forms[0].submit();

我不知道有什么更简单的方法可以做到这一点,如果你能“标记”一些指示所有字段都提交的东西,那就太好了。但我不知道这是否存在,也许其他人可以提供更好的解决方案。

编辑:似乎禁用字段不提交只是 HTML 的本质,与 MVC 无关。


似乎如果您将字段设为readonly 而不是disabled,则值仍将提交。但是,使用这种方法,您将失去“禁用”样式。此规则的例外是select 控件,看来这也不会在readonly 下提交。 More information on this can be in this question

【讨论】:

谢谢,缪斯凡。这仍然是一个非常简单的解决方案。 感谢您的额外研究。使用 readonly 实际上效果很好。无论如何,我对禁用/只读元素都有自己的样式。 @MikeWebb:不用担心,我也很想了解更多相关信息【参考方案2】:

尝试使用 razor 助手构建表单标签。

@using(Html.BeginForm()) ..

// make sure this is a submit button
<input type="submit" value="Save" />

在你的控制器动作 post 方法中确保你装饰它 [HttpPost]。 例如,

[HttpPost] 公共 ActionResult 编辑(YourModel 模型)

【讨论】:

这并不能解决问题,这只是说明如何提交表单。 OP似乎已经能够做到这一点。另外,请正确格式化您的代码 @Tib,问题实际上不在控制器/操作级别。问题是该值不在Request.Params 集合中,该集合被发送到服务器并用于构建传递给动作的模型。在我的情况下,生成的模型是不完整的,因为我没有收到来自表单提交的所有输入值。

以上是关于在 C# MVC 应用程序中,是不是可以在未更改的控件中从网页提交变量?的主要内容,如果未能解决你的问题,请参考以下文章

Mvc3 C# - 是不是可以从不同的控制器调用动作?

如何在 c# mvc 中自动刷新 jqgrid

在构建我的 c# 项目时,出现“在未引用的程序集中定义”错误,如何解决?

C# 错误:不能使用包含在未固定表达式中的固定大小缓冲区

在未安装 .Net Framework 的情况下运行 c# 3 应用程序?

在提交按钮 C# MVC 上获取上传的文件