如何使用一个控制器动作MVC5输入多个类型

时间:2014-01-12 16:13:12

标签: asp.net-mvc html-helper asp.net-mvc-viewmodel

我对MVC很陌生,我想要聪明......

我有一个显示一个问题的视图,但提供了各种响应方法;

@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>

我的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");
    }

如果您检查视图,您会注意到&#34;答案&#34;可以是文本框,复选框,单选按钮或下拉列表。一切都运行正常,一些问题有下拉列表,其他一些单选按钮等。它的帖子让我难过。如果您注意到我没有使用HTML帮助程序,而是旧时尚HTML,因为我不断收到错误,我所提到的类型在我的帮助程序中不存在。

如果它是一个文本框,帖子可以正常工作,但是如果你看看我的控制器动作,你会看到一些注释掉的尝试,如果它是其他控制器之一,也会捕获这些值。

我以为自己对自己的案子很聪明,但现在我似乎无法编写任何能够捕获所选或已检查选项的代码。

任何建议都会很棒!

1 个答案:

答案 0 :(得分:1)

我可以想到一个可能性。在MVC中,您可以在页面上拥有多个表单。不是将所有案例包装在一个表单中,而是使用自己的提交按钮将每个案例作为自己的表单,并为每个案例设置一个操作方法。

修改

另外在查看你的代码时,你会遇到复选框的问题,因为你的Answer属性是一个字符串,如果检查了多个复选框,你将得到一个数组