列出要在View中显示的数据库文件的内容

时间:2013-05-03 02:21:20

标签: c# asp.net-mvc database

我正在使用以C#(SourceAFIS)编写的开源指纹识别程序,该程序将已注册的用户存储在.dat文件中。

要从.dat文件中读取,我使用:

List<MyPerson> database = new List<MyPerson>();
BinaryFormatter formatter = new BinaryFormatter();

if (File.Exists(Database))
{ 
    using (FileStream stream = System.IO.File.OpenRead(Database)) 
    database = (List<MyPerson>)formatter.Deserialize(stream); 
}

其中Database是database.dat文件的路径。

有了这个,我可以使用database.Add(Enroll(Image, Name));将人员注册到系统中。

注册功能如下:

static MyPerson Enroll(string filename, string name)
{
    MyFingerprint fp = new MyFingerprint();
    fp.Filename = filename;
    BitmapImage image = new BitmapImage(new Uri(filename, UriKind.RelativeOrAbsolute));
    fp.AsBitmapSource = image;
    MyPerson person = new MyPerson();
    person.Name = name;
    person.Fingerprints.Add(fp);
    person.Fingerprints[0].Finger = Finger.LeftThumb;
    Afis.Extract(person);
    return person;
}

我想知道是否可以列出数据库中的每个用户并将它们显示在我的一个ASP.NET MVC视图中?我怎样才能检查数据库的写入方式?

修改

在控制器中声明的MyPerson和MyFingerprint类

[Serializable]
class MyPerson : Person
{ public string Name; }

[Serializable]
class MyFingerprint : Fingerprint
{ public string Filename; }

2 个答案:

答案 0 :(得分:1)

示例中的database对象不是传统意义上的数据库。相反,它是序列化为文件的List MyPerson个对象,包括其指纹模板和MyPerson类包含的任何其他值。有一个document描述了用于编写文件的格式,但由于该文件只代表List<MyPerson>类型的对象,因此尝试读取文件的二进制格式并没有太大的好处。我已经多次使用序列化,从来没有费心去查看文件格式。让BinaryFormatter类处理工作会更安全。

如果您还没有,请查看MSDN上序列化的文档。如果您的MyPerson课程将来有可能被更改,您应该查看Version Tolerant Serialization上的部分,以避免在未来发生潜在问题。

database对象可以直接传递给视图,如以下示例代码所示。您可能需要更新视图中的命名空间以反映您的项目。 Index方法中的代码只是为了演示这个概念:它并不能反映出优秀的应用程序架构。

控制器

public class MyPersonController : Controller {

    public ActionResult Index() {
        List<MyPerson> database = new List<MyPerson>();
        BinaryFormatter formatter = new BinaryFormatter();
        if (File.Exists(Database))
        { 
            using (FileStream stream = System.IO.File.OpenRead(Database)) 
            database = (List<MyPerson>)formatter.Deserialize(stream); 
        }


        return View(database);
    }
}

查看,仅列出Name属性

@model IEnumerable<MyPerson>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
    </tr>
}

</table>

答案 1 :(得分:0)

您已在SourceAFIS中使用Sample项目作为基础。您最好使用真实数据库来存储人员和图像的信息。与基于文件的存储相比,这有太多的优势。

  • 允许多个客户
  • 修复并发问题
  • 提供网络访问
  • 提供轻松分页
  • 不需要文件系统访问

您甚至可以使用SQL Server Express版本开始。

现在,回答你的问题

  1. 是的,你可以在你的MVC页面上列出你的用户,并列出他们的照片。
  2. 您不需要检查用户已被写入的“数据库”,因为所有用户都存储在同一个数据库中,您可以使用鉴别器字段来过滤您想要的用户。
  3. 您已经注意到您的知识有限。你应该开始通过研究和阅读来扩展你的知识。您可以开始阅读有关Entity Framework或Linq 2 Sql的内容。

    创建数据库并将dat文件加载到该数据库后,代码将如下(使用Linq2Sql)。

    public class MyPersonController : Controller {
    
        public ActionResult Index() {
            var people = PersonStore.GetAllPeople();
    
            return View(people);
        }
    
        public ActionResult Image(int id) {
            var image = PersonStore.GetPersonImageById(id);
    
            return BinaryResult(image.Content, image.MimeType);
        }
    }
    

    和您的观点

    @model IEnumerable<PersonModel>
    <table>
        @foreach (var Person in Model)
        {
            <td>@person.Name</td>
            <td><img src="@Url.Action("Image", new { id = person.id })"></td>
        }
    </table>