如何输入多种类型的一个控制器动作MVC5

问题描述:

我真的很新的MVC和我巧言令色..如何输入多种类型的一个控制器动作MVC5

我有一个观点,即显示一个问题,但提供响应的各种方法;

@using Microsoft.AspNet.Identity 
@model Template.Models.Question 

@{ 
    ViewBag.Title = "View question"; 
    var qtype = Model.QuestionTypeId; 
    ViewBag.Number = Model.Id - 7; 
    Html.BeginForm("ViewQuestion", "Question", FormMethod.Post, new { @class = "form-horizontal", role = "form" }); 
} 
<div> 
<h4>Question #@ViewBag.Number</h4> 
<hr /> 
<h1> @Model.Question1</h1> 
</div> 
@Html.AntiForgeryToken() 
<div class="form-group"> 
@switch (qtype) 
    { 
    case 1: 
    // Textbox 
     @Html.TextArea("Answer", new { @class = "form-control", rows = "4", col = "5" }); 
     break; 
    case 2: 
    //  Dropdown 
    <select class="form-control" id="Answer"> 
     @foreach (var item in Model.QuestionOptions.OrderBy(o => o.QuestionOptionRanking)) 
     { 
      <option value="@item.QuestionOption1">@item.QuestionOption1</option> 

     } 
    </select> 
break; 
case 3: 
//  Checkbox 
    <div class="checkbox"> 
    @foreach (var item in Model.QuestionOptions.OrderBy(o=> o.QuestionOptionRanking)) 
{ 
     <input type="checkbox" name="Answer" value="@item.QuestionOption1" /> @item.QuestionOption1 <br /> 
       } 
    </div> 
    break; 

case 4: 
//  Radio buttons 
foreach (var item in Model.QuestionOptions.OrderBy(o => o.QuestionOptionRanking)) 
{ 
<div class="radio"> 
    <label> 
     <input type="radio" name="Answer" value="@item.QuestionOption1" /> 
     @item.QuestionOption1 
    </label> 
</div> 
} 

break; 
} 

</div> 
<input type="hidden" name="QuestionId" value="@Model.Id" /> 
<div class="form-group"> 
    <div class="col-md-offset-2 col-md-10"> 
    <input type="submit" class="btn btn-default" value="Answer" /> 
    </div> 
</div> 

My ViewModel;

public class ResponseViewModel 
{ 
    [Required] 
    public string UserId { get; set; } 
    [Required] 
    public int QuestionId { get; set; } 
    [Required(ErrorMessage = "Please answer the question before submitting")] 
    public string Answer { get; set; } 
    [Required] 
    public string Source { get; set; } 
    [Required] 
    public string Status { get; set; } 
    [Required] 
    public System.DateTime DateStamp { get; set; } 
    public Nullable<int> Duplicate { get; set; } 
    public virtual Question Questions { get; set; } 
    public object SelectedValue { get; set; } 
    public virtual ICollection<QuestionOption> QuestionOptions { get; set; } 

} 

最后我的动作;

 [HttpPost] 
     public ActionResult ViewQuestion([Bind(Include = "QuestionId, Answer")] ResponseViewModel responseViewModel) 
     { 
     //var optionSelected = responseViewModel.Answer; 
     //if (optionSelected == null) 
     //{ 
     // optionSelected = responseViewModel.Answer.SelectedValue(); 
     //} 
     Response re = new Models.Response(); 
     re.Answer = responseViewModel.Answer; 
     if (re.Answer == null) 
     { 
      re.Answer = "Work in progress!"; 
     // re.Answer = responseViewModel.SelectedValue(); 
     // re.Answer = int.Parse(SelectList["Question.QuestionOption1"]); 
     } 
      re.UserId = User.Identity.GetUserId(); 
      re.QuestionId = responseViewModel.QuestionId; 
      re.Source = "Web"; 
      re.Status = "New"; 
      re.DateStamp = System.DateTime.Now; 
      db.Responses.Add(re); 
      db.SaveChanges(); 

     return RedirectToAction("ViewQuestion"); 
    } 

如果您检查视图,您会发现“答案”可以是文本框,复选框,单选按钮或下拉列表。一切正常显示,一些问题有dropdownlists,其他单选按钮等。它的发布让我难住。如果你注意到我没有使用过HTML Helpers,但是老式的HTML不断出现错误,我提到的类型在我的帮助者中不存在。

发表作品,如果它是一个文本框罚款,但如果你看看我的控制器动作,你会看到一些注释掉的尝试也搭上了值,如果是其他的控制器之一..

我想我对自己的案例很聪明,但现在我似乎无法编写任何代码来捕获所选或检查的选项。

任何建议将是伟大的!

我可以想到一个可能性,我的头顶。在MVC中,您可以在页面上拥有多个表单。与其将所有案例封装在一个表单中,不要将每个案例都包含在自己的表单中,并使用它自己的提交按钮,并为每一个表单提供一个操作方法。

编辑

同样在看着你的代码,你将不得不与复选框问题,因为你的答案属性是一个字符串,如果超过一个复选框被选中,你会得到一个数组

+0

我会试试看。谢谢 – Alex

+0

这是一个很好的帮助!谢谢。我运行了一些测试,并且代码对于Textbox和单选按钮可以正常工作,但我确实需要找到下拉列表的代码,并且如您所见,我从复选框中获得第一个答案,但其他答案不是。如果我只有3个条件,我是否应该在控制器或案例中使用if语句?是否有性能差异? – Alex

+0

@Alex如果您只有三个条件,我只会使用if语句。没有必要只有三种可能性的情况。 – user1678889