在MVC中只读取所有表单字段

时间:2009-08-31 20:57:16

标签: asp.net-mvc

我正在显示3个或更多版本的表单。一个版本是编辑表单以编辑所有字段。第二个版本将是同一表单的只读版本,它将用于显示所有相同的字段,但客户端的所有字段都具有readonly =“true”,因此用户无法输入数据。 readonly字段需要使用不同的css样式。这是为了显示存档数据。我已经隐藏了提交按钮,所以他们无法提交,但我希望表单看起来像只读。第三个版本将只读取一些字段,并且对于具有有限编辑权限的特定类别的用户可以编辑某些字段。

我正在使用ASP.NET MVC 1.0。如何修改显示的所有(或子集)字段,使其只读。我想迭代控制器中的字段集合并将它们全部设置为只读,并设置正确的css类。我不想在.aspx文件中的每个字段上放置一个if语句(有40-50个字段),我不希望在客户端有这个,所以我可以阻止用户修改javascript / html编辑他们不应该做的事情。

TIA,

Steve Shier

4 个答案:

答案 0 :(得分:14)

请记住,即使您在服务器端将标记设置为只读,用户也可以仍然通过各种方式更改它们,并且无论表单上的值是之前是什么它会被发回给你。

当然,最简单的方法是使用jQuery的客户端:

$(function() {
  $('input, select, textarea').attr('disabled', 'disabled');
});

或者,你可以在你的视图中做到这一点,但它很难看。在我的脑海中,您需要将某种bool传递到视图中(通过我认为的ViewData),并在每个输入上检查一下,看看你是否应添加disabled属性。不是我的乐趣......

答案 1 :(得分:1)

我会根据您所处的状态选择不同的视图,然后根据您所处的状态选择视图。您还可以使用partials来实现它,分解部分以便您可以轻松地包含可编辑或只读版本不同的元素集。因此,只读视图甚至不需要包含表单元素。您还可以使用跨度,div或段落而不是输入元素来显示数据。

注意:您仍然需要检查当前用户是否能够在处理表单提交的操作中更新/创建数据。仅仅因为您限制了以只读格式查看数据的能力,这不会阻止某人制作表单帖子来模仿他们想要的应用程序。您不能依赖隐藏/禁用客户端上的内容来防止恶意用户尝试输入/修改数据。

答案 2 :(得分:0)

我通常使用部分视图来表示表单和/或表单的一部分。

我可以想出两种简单的方法来做你需要的事情(据我所知):

  1. <% Html.RenderPartial(the_right_partial, model); %>其中the_right_partial是从控制器传递的值或帮助程序(在这种情况下,the_right_partial(something));
  2. 从表示可编辑性的控制器传递bool或enum参数,然后使用帮助程序获取正确的htmlAttributes,如: <%= Html.TextBox("name", value, Html.TheRightHtmlAttributesFor(isReadableOrNot)) %>;
  3. 可能还有其他方法,例如为输入字段创建新助手,接受额外的isReadableOrNot arg(但对我来说似乎有点过分),或者像某些奇怪的(以及完全不可读/不可维护的方式)将html / aspx重写,但我不建议他们。

    请注意,使用像disabled 这样的html属性是客户端,而使用像firebug这样的工具只需要两秒钟就可以更改它们。

    其他人已经说过了,但我也必须:总是假设用户会竭尽全力去做最糟糕的事情,所以检查用户权限来修改服务器端的内容,并考虑客户端检查是对用户的礼貌(让她/他明白表格不应该被编辑,在这种情况下)。

答案 3 :(得分:0)

由于我试图对表单的不同状态使用单个部分,我想我将创建辅助函数,它将根据状态和用户正确显示。助手将使用字段字典,该字典将指示字段在何种条件下只读。我仍然会进行服务器端检查以确保数据有效并且用户有权进行更改。

感谢您的所有想法和帮助。

史蒂夫