C# 如何在不使用隐藏字段的情况下检测表单字段是否已更改

C# 如何在不使用隐藏字段的情况下检测表单字段是否已更改,c#,validation,asp.net-mvc-3,C#,Validation,Asp.net Mvc 3,我正在使用ASP.NET MVC 3,需要检测服务器端的表单字段是否已更改。我知道如何使用隐藏字段的技巧,但我想知道是否有一种方法可以通过使用API来做到这一点 基本上,我的模型有一个编辑屏幕,其中一个字段是可以指定的可选id。如果指定了字段,我必须确保它是唯一的(没有其他模型具有它)。因此,在编辑控制器上,我想运行验证,但前提是该字段已更改 请注意,我不需要知道以前的值和新值,只要字段值已更改。您必须在某处保留旧值的副本,并进行比较。您可以将其存储在视图模型中。您必须在某个位置保留旧值的副本,

我正在使用ASP.NET MVC 3,需要检测服务器端的表单字段是否已更改。我知道如何使用隐藏字段的技巧,但我想知道是否有一种方法可以通过使用API来做到这一点

基本上,我的模型有一个编辑屏幕,其中一个字段是可以指定的可选id。如果指定了字段,我必须确保它是唯一的(没有其他模型具有它)。因此,在编辑控制器上,我想运行验证,但前提是该字段已更改



请注意,我不需要知道以前的值和新值,只要字段值已更改。

您必须在某处保留旧值的副本,并进行比较。您可以将其存储在视图模型中。

您必须在某个位置保留旧值的副本,并进行比较。您可以将其存储在视图模型中。

实际上没有“脏”标志-MVC实际上更接近“web工作方式”以重用该语句。所有发送的都是名称-值对。没有别的了。MVC的模型绑定器只是将这些名称与您的对象相匹配——因此,为了真正检测到更改,您必须在发布时根据真实数据源进行验证,或者比较表单上传递的值——在这种情况下,最好进行散列以避免伪造。

实际上没有“脏”标志——MVC实际上更接近“web工作方式”重复使用该语句。所有发送的都是名称-值对。没有别的了。MVC的模型绑定器只是将这些名称与您的对象相匹配——因此,为了真正检测到更改,您必须在post时根据真实数据源进行验证,或者比较表单上传递的值——在这种情况下,最好是散列以避免伪造。

我对MVC模式不是很熟悉,但我会设置一个javascript来捕获更改更改文本框并使用AJAX检查该id是否已存在。为什么不每次都运行验证?@hyp js可以,但我还需要服务器端解决方案(如上所述)。MVC3有一个属性@Remote,可用于AJAX远程validation@jfar如果该字段包含可选id(例如123)且未更改,则我不必进行DB调用。如果它已经被更改,那么我会打一个DB电话,查看另一个客户是否具有相同的id(因此,引发模型验证错误)@zam6ak-在写入期间,额外的select by id电话不会对您造成伤害。我想说,这是一个简单的折衷,因为你在肮脏跟踪中引入了复杂性。我对MVC模式不太熟悉,但我会设置一个javascript来捕获对文本框的更改,并使用AJAX检查该id是否已经存在。为什么不每次都运行验证?@hyp js可以,但我还需要服务器端解决方案MVC3有一个属性@Remote,可以用于AJAX远程validation@jfar如果该字段包含可选id(例如123)且未更改,则我不必进行DB调用。如果该字段已更改,则我将进行DB调用,以查看其他客户是否具有相同的id(从而引发模型验证错误)@zam6ak-写入过程中额外的select by ID调用不会对您造成伤害。我要说的是,这是一个简单的折衷,因为脏跟踪带来了复杂性。嗯……没有其他方法吗?我希望MVC3 API可能会有一些设置“脏”的东西字段上的标记…不,您可以使用任何类作为您的模型,它不需要从任何对象或其他对象继承…因此,如果您要跟踪更改,您必须将旧值存储在模型中,当用户发布表单时,比较值。您建议的是“隐藏字段”/“隐藏字段w/哈希”我希望避免的方法…但我似乎没有选择…事实上。您也可以将整个表单的早期版本存储在会话变量中,但这绝对不是最佳做法。最好将旧值存储在视图模型中,标记为隐藏。嗯…没有其他方法吗?我希望MVC3 API m你可以在字段上设置一个“脏”标志…不,你可以使用任何类作为你的模型,它不需要继承任何东西或其他…因此,如果你想跟踪更改,你必须将旧值存储在模型中,当用户发布表单时,比较这些值。你建议的是“隐藏字段”/我希望避免的“隐藏字段w/hash”方法…但我似乎没有选择…事实上。您也可以将整个表单的早期版本存储在会话变量中,但这绝对不是最佳做法。最好将旧值存储在视图模型中,标记为隐藏。