如何输入多种类型的一个控制器动作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中,您可以在页面上拥有多个表单。与其将所有案例封装在一个表单中,不要将每个案例都包含在自己的表单中,并使用它自己的提交按钮,并为每一个表单提供一个操作方法。
编辑
同样在看着你的代码,你将不得不与复选框问题,因为你的答案属性是一个字符串,如果超过一个复选框被选中,你会得到一个数组
我会试试看。谢谢 – Alex
这是一个很好的帮助!谢谢。我运行了一些测试,并且代码对于Textbox和单选按钮可以正常工作,但我确实需要找到下拉列表的代码,并且如您所见,我从复选框中获得第一个答案,但其他答案不是。如果我只有3个条件,我是否应该在控制器或案例中使用if语句?是否有性能差异? – Alex
@Alex如果您只有三个条件,我只会使用if语句。没有必要只有三种可能性的情况。 – user1678889