【发布时间】:2011-09-01 07:51:09
【问题描述】:
我正在创建一个数据库,用户可以在其中输入一些错误报告,我们可以查看它们。我在 ASP MVC 3 .NET 框架中使用 C# 制作这些数据库(正如标签所暗示的那样)。每个错误报告都有一个唯一的 ID,称为 ReportId,因此它们都不会存储在同一个 ID 下。但是,每当用户创建新错误时,我都会传递他们的用户名并将其与报告的其余部分一起存储(我使用 User.Identity.Name.ToString() 来获取他们的名称并将其存储为字符串)。我知道如何使用 lambda 表达式从数据中获取单个项目,如下所示:
db.DBSetName.Single(g => g.Name == genre)
以上代码基于 ASP 提供的 MVC 3 教程(The Movie Store one)。他们就是这样教我的。
我的主要问题是:是否有像 .Single 这样的成员函数来解析整个数据库并仅输出其存储的用户名与当前登录用户的用户名匹配的数据库条目?然后,我可以使用它来限制用户只能编辑他们自己的条目,因为只有他们的条目会被传递给用户的视图。
实现这一点的最佳方法是什么?由于 ReportId 不会更改,因此可以创建一个新的数据结构来存储用户的错误并传递给该特定控制器的索引(或主页)视图。从那里他们应该能够单击任何编辑链接,这会将存储的 ReportId 传递回此特定控制器的编辑操作,然后可以在整个数据库中搜索它。我假设这会奏效吗?这是否理想,因为数据库中的其他项目未通过此方法传递到索引,这意味着用户无权访问其他项目的 ReportId,用户需要将其传递到编辑操作中它工作吗?如果这是理想的,这就是需要我知道如何解析数据库并获取符合特定描述的每个元素(存储的用户名与用户的当前用户名匹配)的方法。
或者更好的方法是将整个数据库传递到索引视图并仅输出用户名值与当前登录用户匹配的数据库条目?我想这可以在带有嵌套 if 循环的 foreach 循环中完成,如下所示:
@foreach(var item in db.Reports)
{
if(item.UserName == User.Identity.Name.ToString())
{
...code to output table...
}
}
但这会传递整个数据库,从而为用户提供比他们需要的更多的信息。它还使他们有可能获得我不希望他们拥有的信息。但是,我不必创建新的数据结构或数据库,这应该会降低服务器内存使用和获取时间,对吧?还是数据库是通过副本传递的?如果是这样,这种方法似乎有点愚蠢。但是,我不知道第一种方法是否会破坏数据库,这个肯定不会。也不记得我是否需要 C# 中的 else 语句,我更熟悉 C++,你不需要一个,如果我需要一个,你也不需要单行 if 的 {}:请不要对我评价太苛刻!
小提示:我正在使用使用 Entity First 框架制作的 CRUD 控制器来编辑我的数据库。因此,已为我提供了所有创建、读取、更新和删除代码。我选择不添加这样基本的通用代码。如果需要,我可以添加。我将添加编辑操作的样子:
public ActionResult Edit(string id)
{
Report report = db.Reports.Find(id);
return View(report);
}
它接受一个字符串作为 id,ReportId 是使用的 id,它是一个字符串。它是使用 GUID.NewGuid().ToString() 函数生成的随机生成的 GUID 字符串。我还将与以下人员进行名称比较:
Model.UserName == User.Identity.Name.ToString()
前面已经展示过了。抱歉,如果文字太多,我想提供尽可能多的信息,而不是让任何人生气。如果需要更多信息,当然可以提供。所以在文章的最后,主要问题实际上归结为:以上两种方法中哪种方法最好?而且,如果它是第一个,我该如何实现这样的东西?
感谢您的帮助!
【问题讨论】:
标签: c# sql asp.net-mvc-3 filter