【问题标题】:multiple models from one controller一个控制器的多个模型
【发布时间】:2016-02-29 06:28:00
【问题描述】:
  • 我有三个模型,问题表,答案选项表, 正确答案表。Questiontable 的 QuestionId 是 Answeroption tbl 中的外键,Answer tbl 的 AnswerId 是正确答案 tbl 中的外键。我做了三个存储过程,我做了所有的工作 在一个存储过程中,这样当我执行 sp.insertintoquestion 时, 它在问题表中插入数据,同时插入 各个表中的外键。现在我不知道如何插入 从控制器到不同模型的数据以及如何在 看法。我是新人,请帮帮我。

我的存储过程如下。 此存储过程将数据插入 AnswerOptiontbl 并将外键插入 Correctanswer tbl。

  ALTER procedure [dbo].[InsertIntoAnswer]
(
    @questionid int,
    @OptionA nvarchar(50),
    @OptionB nvarchar(50),
    @OptionC nvarchar(50),
    @OptionD nvarchar(50),
    @CorrectOption nvarchar(50)

)
as
begin
 insert into Answertbl(QuestionId,OptionA,OptionB,OptionC,OptionD,CorrectOption)
    values(@questionid,@OptionA,@OptionB,@OptionC,@OptionD,@CorrectOption)
    end

sp.insert 正确答案。此存储过程将数据插入到 CorrectAnswer 表中。

ALTER procedure [dbo].[InsertCorrectAnswer]
(
    @AnswerId int,
    @CorrectAnswer nvarchar(50)
)
as
begin
        insert into CorrectAnswertbl(AnswerId,CorrectAnswer)
        values(@AnswerId,@CorrectAnswer)
        end

现在我在下面的存储过程中定义我的整个逻辑。 sp.插入问题。作为这个 sp exec,它会将数据插入 questiontbl、answeroption 表和正确答案 tbl。同时插入 FK questionid 到 Answeroption 表和 Fk AnswerId 到 CorrectAnswer tbl

ALTER procedure [dbo].[InsertIntoQuestion]
        (
            @QuestionText nvarchar(50),
            @QuestionTypeId int,
            @QuestionLevelId int,
            @questionid int out,
            @OptionA nvarchar(50),
            @OptionB nvarchar(50),
            @OptionC nvarchar(50),
            @OptionD nvarchar(50),
            @CorrectOption nvarchar(50),
            @AnswerId int out,
            @CorrectAnswer nvarchar(50)

        )
        as 
        begin
           insert into Questiontbl(QuestionText,QuestionTypeId,QuestionLevelId)
           values( @QuestionText,@QuestionTypeId,@QuestionLevelId)

           select @questionid= scope_identity();
           exec InsertIntoAnswer @questionid,@OptionA,@OptionB,@OptionC,@OptionD,@CorrectOption

           select @AnswerId=SCOPE_IDENTITY();
           exec InsertCorrectAnswer @AnswerId,@CorrectAnswer
           end

由于我使用的是 DataBase Ist 方法,因此在 Repositry 类中我定义了以下方法,并将参数传递给存储过程所需的参数。但我不确定我的方法是否正确。

public void InsertQuestions( string QuestionText,int QuestionTypeId, int QuestionLevelId, string OptionA, string OptionB,string OptionC,string OptionD,string CorrectOption,string CorrectAnswer,ObjectParameter questionid=null,ObjectParameter AnswerId=null)

        {
            db.InsertIntoQuestion(QuestionText, QuestionTypeId, QuestionLevelId, questionid, OptionA, OptionB, OptionC, OptionD, CorrectOption, AnswerId, CorrectAnswer);
        } 

我在控制器中编写以下代码。 QuestionTypeId 和 QuestionLevelId 是 Questiontbl 中来自 QuestionTypetbl 和 QuestionLeveltbl 的外键。我把这些写在选择列表中。在插入过程中,我将在下拉列表中从相应的表格中选择这两个。

public class MyScoreController : Controller
    {
        ScoreApplication app = new ScoreApplication();
        scoredbEntities db = new scoredbEntities();
        //
        // GET: /MyScore/
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult Create()
        {
            ViewBag.QuestionTypeId = new SelectList(db.QuestionTypetbls, "QuestionTypeId", "QuestionType");
            ViewBag.QuestionLevelId = new SelectList(db.QuestionLeveltbls, "QuestionLevelId", "QuestionLevel");
            return View();
        }
        [HttpPost]
        public ActionResult Create()
        {
            if (ModelState.IsValid)
            {
               //Now i dont now what to do here.
            }
            return View();
        }
    }

以下是视图,但是这个视图只有一个模型,我不知道如何在同一个视图中显示其他模型的数据。

 @model MyScoreProject.Models.Questiontbl

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>


@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Questiontbl</h4>
        <hr />
        @Html.ValidationSummary(true)

        <div class="form-group">
            @Html.LabelFor(model => model.QuestionText, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.QuestionText)
                @Html.ValidationMessageFor(model => model.QuestionText)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.QuestionTypeId, "QuestionTypeId", new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("QuestionTypeId", String.Empty)
                @Html.ValidationMessageFor(model => model.QuestionTypeId)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.QuestionLevelId, "QuestionLevelId", new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("QuestionLevelId", String.Empty)
                @Html.ValidationMessageFor(model => model.QuestionLevelId)
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

【问题讨论】:

    标签: asp.net-mvc-4 model-view-controller


    【解决方案1】:

    我们的想法是拥有不同的视图模型和域模型。我假设你有一个分层的架构。你提到的模型应该在不同的层。在那里,您的模型与您的表格相对应。

    在 MVC 项目中,您应该在 Models 文件夹中有视图模型。这些模型基于您需要在视图中显示的数据。这些模型由来自域模型的不同属性(或计算属性)组成。因此,您可以将此视图模型传递给视图并获取与不同域模型(或 BusinessObjects.

    示例

    public class MyViewModel{
        //some properties from questions to display
        //.
        //.
        //.
        //some properties from answer to capture
        //.
        //.
        //.
    }
    

    并在视图中使用:

    @model MyScoreProject.Models.MyViewModel
    

    EDIT:1(控制器)

        public ActionResult Create()
        {
            Question q = bal.GetQuestion(someQuestionParameter);
            Answer a = bal.GetAnswer(someAnswerParameter)
    
            MyViewModel m = new MyViewModel(q,a);
            return View(m);
        }
        [HttpPost]
        public ActionResult Create(MyViewModel model)
        {
            if (ModelState.IsValid)
            {
               //from data of model, construct questions and answer objects and save them in DB
            }
            return View(m);
        }
    

    【讨论】:

    • 是的,但我必须在控制器中做些什么。我需要逻辑来说明如何在控制器的操作方法中使用我在存储库类中定义的方法。
    • 编辑了我的答案...希望对您有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多