ASP.NET MVC保存新纪录诗歌更新现有的记录约定
我正在研究我的第一个ASP.NET MVC(测试版3)应用程序(使用EF4),并且我正在努力一些约定来保存新记录和更新现有记录。 我正在使用标准路由映射。
当用户转到页面/会话/评估时,他们可以输入新记录并保存。 我有一个像这样定义的动作:
[ActionName("Evaluate")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EvaluateSave(EvaluteSessionViewModel evaluatedSession)
{
}
当他们保存时,我从视图模型中取出一个实体并将其附加到我的上下文并保存。 到现在为止还挺好。 现在我希望用户能够通过url / session / Evaluate / 1编辑此记录,其中'1'是记录ID。
编辑:我有我的EF实体作为属性附加到视图模型。
如果我添加一个重载的方法,像这样(所以我可以自动检索'1'部分)。
[ActionName("Evaluate")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EvaluateSave(ID, EvaluteSessionViewModel evaluatedSession)
{
}
我得到一个“控制器类型'SessionsController'的当前操作请求'Evaluate'在以下操作”错误“之间不明确。 我不确定他们为什么看起来很模糊,因为他们看起来很独特。
我决定现在我只是跳过这个问题,看看我是否可以更新现有的记录,所以我评论了没有ID参数的EvaluateSave。
我想要做的是这样的:
// Load the original entity from EF
// Rebind the postback so that the values posted update the entity
// Save the result
由于实体被填充为参数(evaluateSession),所以重新绑定发生得太快。 但是当我看着我想要采用的方法时,我意识到它将我的代码打开为黑客行为(因为用户可以将字段添加到发布的后台页面中,并且这些字段可以覆盖我在实体中设置的值)。
所以看起来我不得不手动检查每个字段,看看它是否已经改变,如果有,更新它。 像这样的东西:
if (evaluatedSession.MyEntity.myField <> savedSession.myField)
savedSession.myField = evaluatedSession.MyEntity.myField;
或者,保存该实体的副本,并确保没有任何非用户可编辑的内容已经更改。 呸。
所以有两个问题:
首先:我如何消除重载方法的歧义?
第二:是否有更好的方式来处理更新先前保存的记录?
编辑:我想我可以使用像Automapper的东西...
编辑2010年9月22日 - 好吧,它看起来应该是两个项目的组合:你可以通过[Bind(Exclude =“field1,field2”)来控制哪些字段绑定(并且特别排除某些字段) )]属性,无论是在类级别还是作为执行保存的方法的一部分,例如。
public ActionResult EvaluateSave([Bind(Exclude="field1")] EvaluateSessionViewModel evaluatedSession)
从EF的角度来看,你应该能够从上下文中使用ApplyCurrentValues()方法,例如。
context.ApplyCurrentValues(savedEval.EntityKey.EntitySetName, evaluatedSession);
当然,这似乎不适合我。 我一直得到“在ObjectStateManager中找不到与提供对象的键匹配的键的对象,请确认提供的对象的键值与要应用更改的对象的键值匹配。”
我尝试附加刚刚加载的原始实体,以防因某种原因(在ApplyCurrentValues之前)未附加到上下文中):
context.AttachTo(savedEval.EntityKey.EntitySetName, savedEval);
它仍然失败。 我猜它与MVC创建的EF实体对象的类型有关(可能没有足够EF4对它做任何事情?)。 我曾希望能够让.NET框架逐步完成它,看看它正在尝试做什么,但看起来EF4并不是这笔交易的一部分。 我用反射器来看它,但对于我想象发生的事情有点困难。
那么,它的工作方式是每个httpverb只能有一个方法名称。 所以最简单的方法是创建一个新的操作名称。 类似于“创建”新记录和“编辑”现有记录。
您可以使用AntiForgeryToken(http://msdn.microsoft.com/zh-cn/library/dd492767.aspx)验证数据。 它并不能阻止所有黑客攻击行为,但这是一个额外的好处。
额外
每个httpverb只能有一个动作名称的原因是模型绑定器只会尝试建模绑定,而且实际上不是类型特定的。 如果您有两个具有相同操作名称和两种不同类型参数的方法,则不能只尝试找到最佳匹配,因为您的意图可能显然是一件事,而程序只能看到某种最佳匹配。 例如,您可能有一个参数Id和一个包含属性Id的模型,它可能不知道您打算使用哪一个。
链接地址: http://www.djcxy.com/p/25467.html上一篇: ASP.NET MVC save new record verse update existing record conventions