面试页面的数据库和代码结构

时间:2013-12-16 16:43:55

标签: asp.net-mvc entity-framework database-design code-first asp.net-mvc-5

如果有更好的方法来构建我正在为客户重写的面试页面,我正在尝试解决问题。我正在使用MVC 5和Entity Framework 6重写该站点。

目前,数据库有一个表格,其中包含名为question1,question2等的列......直到问题23.当用户完成面试问题时,会插入一个新行,其中包含每个问题的答案或者他们拥有的问题。选择回答。这似乎是错误的,因为问题文本被硬编码到视图中,因此如果问题被更新,他们当前更改视图中的文本或者如果它被删除,他们从视图中删除问题并留下数据库中的内容!

我希望能够重写它,以便他们可以在新的管理面板中管理问题,这样他们就可以在后端添加/编辑/删除问题而无需编辑视图或在db表中留下旧问题。

我在考虑如下两个表结构(使用代码优先):

InterviewQuestions   - Id(int)   - 问题(字符串)

InterviewAnswers   - Id(int)   - UserId(string)   - QuestionId(int)   - 答案(字符串)

视图模型  - 清单 (  QuestionId  - 题   - AnswerId   - 回答)

但我正在努力的是如何展示面试表格。我可以迭代视图模型中的所有问题并显示问题和答案的文本框。但是,当用户填写答案并点击保存时,我将如何知道哪个答案属于哪个问题?我希望这是有道理的,因为我似乎无法想出一个更好的方法来实现它!

感谢您的任何建议

1 个答案:

答案 0 :(得分:0)

我会创建另一个viewModel,它可以帮助我将问题与答案联系起来。这样。

<强>视图模型

public class InterviewViewModel
{
    public List<QuestionViewModel> questionsViewModel {get;set;}
}

public class QuestionViewModel
{
    public int QuestionId{get;set;}
    public string Question{get;set;}
    public string Answer{get;set;}
}

控制器GET :在这里,您可以使用从数据库中获得的问题填充viewModel列表。

public Create()
{   
    var viewModel = new InterviewViewModel();
    var questionListFromDB = context.InterviewQuestions.All().ToList();//Get your questions
    foreach(var question from questionListFromDB)
    {
        var questionVm = new QuestionViewModel();
        questionVm.QuestionId = question.Id;
        questionVm.Question = question.Question;
        viewModel.questionsViewModel.Add(questionVm);
    }
    return View(viewModel);
}

查看:在视图中,您只需公开问题并获得答案

@foreach(var question in model.questionsViewModel)
{
    //text with the question
    //text for the answer
}

控制器POST :在控制器发布操作中,您通过视图模型的列表进行迭代,并为每个回答的问题创建一个新答案:

[HttpPost]
public Create(InterviewViewModel model)
{
    foreach(var question in model.questionsViewModel)
    { 
        var answerToCreate = new InterviewAnswers();
        answerToCreate.QuestionId = question.Id;
        answerToCreate.Answer= question.Answer;
        //here you save your answer.
    }
}

P.S:您还可以向视图发送QuestionViewModel的列表,但我更喜欢将我的视图发送到其他内容中的一个对象。也许您稍后需要其他东西用于视图,如果它只是一个对象,则更容易,您只需向该对象添加一个新字段。让我们知道;)