【问题标题】:Database and code structure for a interview page面试页面的数据库和代码结构
【发布时间】:2014-01-04 03:34:32
【问题描述】:

我正在尝试确定是否有更好的方法来构建我正在为客户重新编写的采访页面。我正在使用 MVC 5 和 Entity Framework 6 重写网站。

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

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

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

面试题 - ID(整数) - 问题(字符串)

面试答案 - ID(整数) - 用户 ID(字符串) - QuestionId(整数) - 答案(字符串)

视图模型 - 列表 ( 问题 ID - 题 - 答案ID - 答案)

但我苦苦挣扎的是如何显示面试表格。我可以遍历视图模型中的所有问题并显示问题和答案的文本框。但是当用户填写答案并点击保存时,我怎么知道哪个答案属于哪个问题?我希望这是有道理的,因为我似乎想不出更好的表达方式!

感谢您的任何建议

【问题讨论】:

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


    【解决方案1】:

    我会创建另一个 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;}
    }
    

    Controller 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
    }
    

    Controller POST:在控制器 Post 操作中,您遍历 View-model 的列表并为每个回答的问题创建一个新答案:

    [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 的列表,但我更喜欢只发送我的视图,其中包含其他所有内容。也许您稍后需要其他东西来查看视图,如果它只是一个对象,则更容易,您只需向该对象添加一个新字段。让喵知道;)

    【讨论】:

    • 感谢 Guillelon 的回答,不过我只有一个问题。在控制器 POST 中,我如何知道 QuestionID 是什么?当然,如果它没有在隐藏字段中发布回来,它会丢失吗?
    • 是的,实际上您必须将其放在视图中的隐藏字段中。 @Html.HiddenFor 会很好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多