- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 C# MVC 为我自己的学术目的构建一个小型内容管理系统。
我有创建页面的功能(列出页面、删除页面等)
在基本层面上,我使用 ID 来验证所有页面都是唯一的。但是当我使用 MVC 时,页面本质上是一个 View - 它可以包含 Razor 。所有这一切都没有问题。
但是我的 ViewName 也必须是唯一的(数据库中不能有两个同名的 View )。此外,我的 ViewPath 必须是唯一的(你不能有两条相同的路线)。
在我的创建页面中,我进行了检查(所有工作)以确保创建一个具有唯一 ID 的新 View ,并且它在创建 View 之前检查 ViewName 和 ViewPath 是否都是唯一的,如果不是则返回相关错误。
所有这些都有效。
现在当我去编辑 View 时。用户可以选择更改 ViewName 和 ViewPath。所以我们需要确保它不会更改为已经存在的 ViewName 和 ViewPath。然而,当我们编辑 View 时, View 本身已经存在,所以我们会收到这些错误信息。
所以我们需要检查我们是否保存到同一个页面,所以我们在 ViewName 的 DB 中查找记录的 id 与当前的 ViewName(因为 ViewNames 是唯一的,所以我们可以得到 ID),并且验证我们确实保存到相同的 View 。然后我们可以使用此检查来确保我们不会显示上述错误,因为我们只是更改 View 的名称并且它不匹配任何现有 View 。
问题是当我点击这条线时出现以下错误
db.Entry(view).State = EntityState.Modified;
错误是:
Additional information: Attaching an entity of type 'xxx' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.
问题:我不知道我的解决方案是否过于复杂,如果是这样,有人可以通过示例建议更好的解决方案。
如果这是正确的“方式”,但我只是以某种方式实现错误,有人可以告诉我如何解决它。
下面是我遇到问题的编辑 Controller 操作的 POST 方法:
public ActionResult Edit([Bind(Include = "Id,ViewName,ViewPath,ViewContent")] View view)
{
View sameView1 = db.View.First(v => v.ViewName == view.ViewName);
bool sameview2 = view.Id == sameView1.Id;
bool ViewExists = db.View.Any(v => v.ViewName == view.ViewName);
if (ViewExists && !sameview2)
{
ModelState.AddModelError("ViewName", UI_Prototype_MVC_Resources.ErrorViewAlreadyExists);
return View(view);
}
bool PathExists = db.View.Any(v => v.ViewPath == view.ViewPath);
if (PathExists && !sameview2)
{
ModelState.AddModelError("ViewPath", UI_Prototype_MVC_Resources.ErrorPathAlreadyExists);
return View(view);
}
if (ViewExists && PathExists && sameview2)
{
if (ModelState.IsValid)
{
db.Entry(view).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
}
return View(view);
}
下面是创建 Controller 操作的 POST 方法。这工作正常,仅供引用,它可以帮助任何人:
public ActionResult Create(View view)
{
bool ViewExists = db.View.Any(v => v.ViewName == view.ViewName);
if (ViewExists)
{
ModelState.AddModelError("ViewName", UI_Prototype_MVC_Resources.ErrorViewAlreadyExists);
return View(view);
}
bool PathExists = db.View.Any(v => v.ViewPath == view.ViewPath);
if (PathExists)
{
ModelState.AddModelError("ViewPath", UI_Prototype_MVC_Resources.ErrorPathAlreadyExists);
return View(view);
}
if (!ViewExists && !PathExists)
{
if (ModelState.IsValid)
{
view.ViewContent = "<p>Initial Content</p>";
db.View.Add(view);
db.SaveChanges();
return RedirectToAction("Index");
}
}
return View(view);
}
如果添加评论有帮助,请告诉我,我会进行编辑。本质上它只是从资源文件中读取错误字符串。它还只是读取 ViewName、ViewPath 以检查记录是否已存在。
在编辑 Controller 操作的情况下,有一个额外的检查来拉回当前的记录 ID,以验证如果我们更改名称,记录仍然是相同的(因此它不匹配基于现有的记录在 ViewName 上)。
Encase 对任何人都有帮助,我对数据库中的 ViewName 和 ViewPath 字段有独特的约束。如果字段不唯一并且由于某些奇怪的原因未在代码中处理,这些将导致代码中出现异常。
我不禁觉得这里太复杂了?
最佳答案
是的,你把它弄得太复杂了,你可以通过检查它是否有效来简化你的代码并减少数据库调用的次数
bool isViewNameInvalid = db.View.Any(v => v.ViewName == view.ViewName && v.Id != view.Id)
ViewPath
也是如此。您还应该考虑在返回 View 之前进行这两项检查,这样如果用户有这两个错误,他们就不需要进行额外的提交来通知第二个错误。
另请注意,您的 View sameView1 = db.View.First(v => v.ViewName == view.ViewName);
代码行可能不会返回 View
您期望的记录(它可能是您编辑的记录或以前创建的具有相同 ViewName
值的记录),这可能会导致意外结果。
你的代码可以简化为
public ActionResult Edit([Bind(Include = "Id,ViewName,ViewPath,ViewContent")] View view)
{
bool isViewNameInvalid = db.View.Any(v => v.ViewName == view.ViewName && v.Id != view.Id)
if (isViewNameInvalid)
{
ModelState.AddModelError("ViewName", UI_Prototype_MVC_Resources.ErrorViewAlreadyExists);
}
bool isViewPathInvalid = db.View.Any(v => v.ViewPath == view.ViewPath && v.Id != view.Id)
if (isViewPathInvalid)
{
ModelState.AddModelError("ViewName", UI_Prototype_MVC_Resources.ErrorPathAlreadyExists);
}
if (!ModelState.IsValid)
{
return View(view);
}
// Save and redirect
db.Entry(view).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index")
}
作为旁注,您可以考虑在 ViewName
和 ViewPath
属性上实现 RemoteAttribute
以提供客户端验证(引用 How to: Implement Remote Validation in ASP.NET MVC ).在您的情况下,您会将 Id
值作为 additionalFields
传递。
并且由于您的编辑数据,我建议您使用 View 模型(并删除 [Bind]
属性 - 引用 What is ViewModel in MVC?。
关于c# - 确保另一条记录不包含字段的相同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260932/
我的问题:非常具体。我正在尝试想出解析以下文本的最简单方法: ^^domain=domain_value^^version=version_value^^account_type=account_ty
好吧,这就是我的困境: 我正在为 Reddit 子版 block 开发常见问题解答机器人。我在 bool 逻辑方面遇到了麻烦,需要一双更有经验的眼睛(这是我在 Python 中的第一次冒险)。现在,该
它首先遍历所有 y 值,然后遍历所有 x 值。我需要 X 和 y 同时改变。 For x = 3 To lr + 1 For y = 2 To lr anyl.Cells(x, 1)
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
如何转换 Z-score来自 Z-distribution (standard normal distribution, Gaussian distribution)到 p-value ?我还没有找到
我正在重写一些 Javascript 代码以在 Excel VBA 中工作。由于在这个网站上搜索,我已经设法翻译了几乎所有的 Javascript 代码!但是,有些代码我无法准确理解它在做什么。这是一
我遇到过包含日期格式的时间戳日期的情况。然后我想构建一个图表,显示“点击”项目的数量“每天”, //array declaration $array1 = array("Date" => 0); $a
我是scala的新手! 我的问题是,是否有包含成员的案例类 myItem:Option[String] 当我构造类时,我需要将字符串内容包装在: Option("some string") 要么 So
我正在用 PHP 创建一个登录系统。我需要用户使用他或她的用户名或电子邮件或电话号码登录然后使用密码。因为我知道在 Java 中我们会像 email==user^ username == user 这
我在 C++ 项目上使用 sqlite,但是当我在具有文本值的列上使用 WHERE 时出现问题 我创建了一个 sqlite 数据库: CREATE TABLE User( id INTEGER
当构造函数是显式时,它不用于隐式转换。在给定的代码片段中,构造函数被标记为 explicit。那为什么在 foo obj1(10.25); 情况下它可以工作,而在 foo obj2=10.25; 情况
我知道这是一个主观问题,所以如果需要关闭它,我深表歉意,但我觉得它经常出现,让我想知道是否普遍偏爱一种形式而不是另一种形式。 显然,最好的答案是“重构代码,这样你就不需要测试是否存在错误”,但有时没有
这两个 jQuery 选择器有什么区别? 以下是来自 w3schools.com 的定义: [attribute~=value] 选择器选择带有特定属性,其值包含特定字符串。 [attribute*=
为什么我们需要CSS [attribute|=value] Selector根本当 CSS3 [attribute*=value] Selector基本上完成相同的事情,浏览器兼容性几乎相似?是否存在
我正在解决 regx 问题。我已经有一个像这样的 regx [0-9]*([.][0-9]{2})。这是 amont 格式验证。现在,通过此验证,我想包括不应提供 0 金额。比如 10 是有效的,但
我正在研究计算机科学 A 考试的样题,但无法弄清楚为什么以下问题的正确答案是正确的。 考虑以下方法。 public static void mystery(List nums) { for (
好的,我正在编写一个 Perl 程序,它有一个我收集的值的哈希值(完全在一个完全独立的程序中)并提供给这个 Perl 脚本。这个散列是 (string,string) 的散列。 我想通过 3 种方式对
我有一个表数据如下,来自不同的表。仅当第三列具有值“债务”并且第一列(日期)具有最大值时,我才想从第四列中获取最大值。最终值基于 MAX(DATE) 而不是 MAX(PRICE)。所以用简单的语言来说
我有一个奇怪的情况,只有错误状态保存到数据库中。当“状态”应该为 true 时,我的查询仍然执行 false。 我有具有此功能的 Controller public function change_a
我有一个交易表(针对所需列进行了简化): id client_id value 1 1 200 2 2 150 3 1
我是一名优秀的程序员,十分优秀!