2012-05-26 57 views
2

我試圖建立一個small Questionbank application using MVC3 razor and EF4.這是我的試題庫剃鬚刀頁:返回Partialview項目控制器在試題庫剃刀應用

@using System.Linq 

@model MvcApplication1.ViewModels.QuestionBankViewModel 
@{ 
    ViewBag.Title = " Question Bank"; 

} 

    @Html.ValidationSummary(true) 


<link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 

<script src="../../Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script> 
     @using (Ajax.BeginForm(new AjaxOptions() 
    { 

     UpdateTargetId = "divToAddQuestion", 
     InsertionMode = InsertionMode.InsertAfter, 
    })) 
    { 


<div class="div_question"> 
    <table class="table_question"> 
     <tr> 
      <td rowspan="3"> 

      </td> 
      <td> 
       <span>Question Bank Title</span> 
      </td> 
      <td>@Html.EditorFor(model => model.QuestionBank.QuestionBankName) @*Question*@ 
      </td> 
      <td> 

      </td> 
     </tr> 
     <tr> 
      <td> 

      </td> 
      <td> 
      </td> 
      <td> 
      </td> 
     </tr> 


    </table> 

     <div class="div_answer"> 
      <table class="table_answer"> 
       <tr> 
        <td> 
         <span>Questions()</span> 
        </td> 
        <td> 
         &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        </td> 
        <td> 
         <input type="submit" id="btnAddQuestion" name="ButtonCommand" value="Add Question" class="cancel" /> 
        </td> 
        <td></td> 
       </tr> 
      </table> 

     </div> 
     <div id="divToAddQuestion"> 

     </div> 
      <div id="divToAddAnswer"> 
     </div> 

</div> 
      <div> 

     <input type="submit" id="btnSaveQuestionBank" name="ButtonCommand" value="Save" /> 

    </div> 

    } 

當我點擊btnAddQuestion,我打電話給我的PartialView _Question 每次我clcik btnAddQuestion _Question

這裏是我的局部視圖,它會載入我partialView頁_Question

@using System.Linq 

@model MvcApplication1.Models.Question 
@{ 
    ViewBag.Title = " Question"; 

} 

    @Html.ValidationSummary(true) 

<link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 


<div class="div_question"> 
    <table class="table_question"> 
    <tr> 

     <td> 
       <span>Question Number:</span> 
      </td> 
      <td > 
       @Html.TextBoxFor(model => model.QuestionIndex, new { @class = "tinytextbox" }) 
      </td> 
      <td></td> 
     </tr> 
     <tr> 
      <td> 
       <span>Question</span> 
      </td> 
      <td>@Html.EditorFor(model => model.strQuestion) @*Question*@ 
      </td> 
      <td> 
       @Html.ActionLink("Delete this", "Delete", new { id = Model.QuestionIndex }, new { @class = "deletebutton2", title = "Click to delete this Question and its Answers" }) 
      </td> 
     </tr> 

    </table> 

     <div class="div_answer"> 
      <table class="table_answer"> 
       <tr> 
        <td> 
         <span>Answers()</span> 
        </td> 
        <td> 
         &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        </td> 
        <td> 
         <input type="submit" id="btnAddAnswer" name="ButtonCommand" value="Add Answer" class="cancel" /> 
        </td> 
       </tr> 
      </table> 

     </div> 
     </div> 

這裏是我的模型類

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 

    namespace MvcApplication1.Models 
    { 
     public class QuestionBank 
     { 
      public virtual int QuestionBankId { get; set; } 
      public virtual string QuestionBankName { get; set; } 
      public virtual List<Question> Questions { get; set; } 
      public virtual List<Answer> Answers { get; set; } 
      public virtual int SubjectTypeId { get; set; } 

     } 

     public class Question 
     { 
      public int QuestionId { get; set; } 
      public int QuestionIndex { get; set; } 
      public string strQuestion { get; set; } 
     } 

     public class Answer 
     { 
      public int AnswerId { get; set; } 
      public int QuestionId { get; set; } 
      public string strAnswer { get; set; } 
      public int AnswerIndex { get; set; } 
     } 
    } 

這裏是我的ViewModel

using System.Collections.Generic; 
using MvcApplication1.Models; 

namespace MvcApplication1.ViewModels 
{ 
    public class QuestionBankViewModel 
    { 
     public QuestionBank QuestionBank { get; set; } 
     public IEnumerable<Question> Questions { get; set; } 
     public IEnumerable<Answer> Answers { get; set; } 
     public string ButtonCommand { get; set; } 
     public int QuestionIndex { get; set; } 
     public int AnswerIndex { get; set; } 
    } 

} 

當我點擊btnAnswer,我需要加載我partialView _Answer

@using System.Linq 
@model MvcApplication1.Models.Answer 
@{ 
    ViewBag.Title = " Answer"; 

} 
@Html.ValidationSummary(true) 
<link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 
<div class="div_answer"> 
    <table class="table_answer"> 
     <tr> 
      <td> 
       <span>Answer Number:</span> 
      </td> 
      <td> 
       @Html.TextBoxFor(model => model.AnswerIndex, new { @class = "tinytextbox" }) 
      </td> 
      <td> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <span>Answer</span> 
      </td> 
      <td>@Html.EditorFor(model => model.strAnswer) @*Question*@ 
      </td> 
      <td> 
      </td> 
     </tr> 
    </table> 
</div> 

在這裏,我可以添加一個答案。每次點擊Add ans它都會加載新答案。

當用戶完成添加問題及其相應答案時,用戶可以使用EF4上下文單擊並保存整個問題庫。

這裏我的問題是當我點擊我的保存按鈕時,我無法找到我輸入的問題和答案。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MvcApplication1.ViewModels; 
using MvcApplication1.Models; 

namespace MvcApplication1.Controllers 
{ 
    public class HomeController : Controller 
    { 
     Question qmodel = new Question(); 
     Answer amodel = new Answer(); 

     [HttpGet] 
     public ActionResult QuestionBank() 
     { 
      return View(); 
     } 
     [HttpPost] 
     public ActionResult QuestionBank(QuestionBankViewModel model) 
     { 
      switch (model.ButtonCommand) 
      { 
       case "Add Question": 
        model.QuestionIndex++; 
        qmodel.QuestionIndex = model.QuestionIndex ; 
        return PartialView("_Question", qmodel); 
        break; 
       case "Add Answer": 
        model.AnswerIndex++; 
        amodel.AnswerIndex = model.AnswerIndex; 
        return PartialView("_Answer", amodel); 
        break; 
       case "Save": 
        this.SaveQuestionBank(model); 
        break; 
      } 
      return View(model); 
     } 

     public ActionResult Question() 
     { 
      ViewBag.Message = "Welcome to ASP.NET MVC!"; 

      return View(); 
     } 

     public void SaveQuestionBank(QuestionBankViewModel model) 
     { 
      QBContext context = new QBContext(); 
      foreach (Question question in model.Questions) 
      { 
       context.Question.Add(question); 
      } 
      foreach (Answer answer in model.QuestionBank.Answers) 
      { 
       context.Answer.Add(answer); 
      } 

      context.QuestionBank.Add(model.QuestionBank); 


     } 
     public ActionResult About() 
     { 
      return View(); 
     } 
    } 
} 

我的用戶應該能夠添加和刪除的許多問題,因爲他們想要回答的選擇,最後他們應該能夠與保存按鈕單擊保存一切。

當我點擊保存按鈕,我期待IEnumerable<Question> QuestionsIEnumerable<Answer> Answers在我的控制器,但我總是讓他們爲空。爲什麼,我該如何解決這個問題? 或者你認爲我的方法有什麼問題嗎?

這是我的完整源代碼here,因爲它是,但無法獲得問題和答案給我的控制器。感謝您的意見和建議。

回答

0

我無法嘗試您發佈的代碼,因爲我不認爲所有的作品都可以拍攝,但我認爲我可以投入一些光線來發現問題。

當你通過綁定模型集合綁定,你必須確保產生應遵循的規則:)

舉個例子投入要素的name財產..

領域模型

public class Movie 
    { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    } 

視圖模型

public class AddMoviesModel 
    { 
    public Movie[] Movies { get; set; } 
    } 

POST操作

[HttpPost] 
public ActionResult Index(AddMoviesModel moviesModel) 
{ 
    // save to db? 
} 

,通過它我可以添加5部電影

@model MvcBinding.Models.AddMoviesModel 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

@using (Html.BeginForm()) 
{ 
    for (var i = 0; i < 5; i++) 
    { 
    <p> 
     @Html.EditorFor(m => m.Movies[i]) 
    </p> 
    } 
    <input type="submit" value="Submit"/> 
} 

這裏要注意的重要一點形式是我生成的輸入元素的方式來增加5部電影。如果看到視圖源,該輸入元件的名稱應該變爲如影[0] .X,影[1] .X ..(注意MoviesAddMoviesModel的屬性名)

<input type="text" name="Movies[0].Id" /> 
<input type="text" name="Movies[0].Name" /> 

<input type="text" name="Movies[1].Id" /> 
<input type="text" name="Movies[1].Name" /> 

... 

請檢查查看源代碼,並確保輸入元素的名稱遵循這些規則以發生集合的模型綁定。

UPDATE:

我看着代碼..嗯..

問題是你已經有了一個父窗體和每次添加新的子窗體單擊添加問題按鈕。當您嘗試提交的主要形式子窗體的問題都沒有得到發佈到服務器,因此沒有約束力:(

爲什麼你需要每一個問題 - 答案對包裹在HTML形式?

事實是你不需要的HTML表單只是爲了讓AJAX調用。

,則應該更換添加問題添加答案正常按鈕(而不是提交),你有一些JavaScript鉤到點擊事件這些按鈕讓服務器調用來獲取部分視圖,或者甚至可以用Ajax替換這些按鈕.ActionLinks。 你必須改變現在實施的方式

+0

在你的代碼中,你知道你將添加5個電影。但在我的情況下,我的用戶應該能夠添加任意數量的questions.means每次我點擊「添加問題」按鈕,它會允許用戶鍵入新問題 – Renny

+0

我的代碼現在生成Html輸出,如上所述,但仍然無法將這些值查找到我的控制器。您可以看到我的代碼https://skydrive.live.com/redir? resid = 864D352394305F88!114&authkey =!AO_jCqaXx0KmHeU – Renny

+0

我更新了我的答案,按照您的建議檢查了 – VJAI