我在MVC 3.0 Razor视图中创建了一个页面。 的 Create.cshtml
@model LiveTest.Business.Models.QuestionsModel
@*<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>*@
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<table cellpadding="1" cellspacing="1" border="0">
<tr>
<td>@Html.LabelFor(model => model.TestID)
</td>
<td>
@Html.DropDownListFor(model => model.TestID, (IEnumerable<SelectListItem>)ViewBag.ItemIDList)@Html.ValidationMessageFor(model => model.TestID)
</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.Question)
</td>
<td>@Html.EditorFor(model => model.Question)@Html.ValidationMessageFor(model => model.Question)
@Html.HiddenFor(model => model.QuestionsID)
</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.IsRequired)
</td>
<td>@Html.CheckBoxFor(model => model.IsRequired)@Html.ValidationMessageFor(model => model.IsRequired)
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type="submit" value="Submit" />
</td>
</tr>
</table>
}
QuestionsController.cs
public class QuestionsController : Controller
{
#region "Attributes"
private IQuestionsService _questionsService;
#endregion
#region "Constructors"
public QuestionsController()
: this(new QuestionsService())
{
}
public QuestionsController(IQuestionsService interviewTestsService)
{
_questionsService = interviewTestsService;
}
#endregion
#region "Action Methods"
public ActionResult Index()
{
return View();
}
public ActionResult Create()
{
InterviewTestsService _interviewService = new InterviewTestsService();
List<InterviewTestsModel> testlist = (List<InterviewTestsModel>)_interviewService.GetAll();
ViewBag.ItemIDList = testlist.Select(i => new SelectListItem() { Value = i.TestID.ToString(), Text = i.Name });
return View();
}
[HttpPost]
public ActionResult Create(QuestionsModel questions)
{
if (ModelState.IsValid)
{
_questionsService.Add(questions);
return RedirectToAction("Index");
}
InterviewTestsService _interviewService = new InterviewTestsService();
List<InterviewTestsModel> testlist = (List<InterviewTestsModel>)_interviewService.GetAll();
ViewBag.ItemIDList = testlist.Select(i => new SelectListItem() { Value = i.TestID.ToString(), Text = i.Name });
return View(questions);
}
#endregion
}
QuestionsModel.cs
public class QuestionsModel : IQuestionsModel
{
[ReadOnly(true)]
public Guid QuestionsID { get; set; }
[Required]
[DisplayName("Question")]
public string Question { get; set; }
[DisplayName("Test ID")]
public Guid TestID { get; set; }
[DisplayName("Is Required")]
public bool IsRequired { get; set; }
[DisplayName("Created By")]
public Guid CreatedBy { get; set; }
}
问题:
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
如果我在 Create.cshtml 页面中添加以上两行,然后按下提交按钮,则会触发验证消息“问题是必需的!” 如果我在* 问题 字段中输入值,然后按提交按钮我的[HttpPost]Create
方法永远不会执行。 *
如果我从页面中删除上面两行,然后按提交按钮,那么如果我在问题字段中输入值,那么它将从服务器端执行[HttpPost]Create
方法和激活验证,然后{ {1}}已执行。
请帮帮我。
答案 0 :(得分:0)
我会在尝试提交表单时检查是否发生任何客户端错误。从浏览器控制台检查它。
另外,在提交表单之前,请确保您已完成代码且没有验证错误。
答案 1 :(得分:0)
您是说该表单未验证客户端,并且没有任何内容被发送回您的服务器?
意思是,你点击提交按钮,浏览器没有任何反应,对吗?
问题可能是您的表单未通过不显眼的javascript库验证进行验证。
答案 2 :(得分:0)
QuestionsModel
类包含一个未包含在视图中的属性CreatedBy
。
尝试添加CreatedBy
作为隐藏字段,或者(更好)从QuestionsModel类中删除CreatedBy
,因为它不是应该在视图中公开的属性。
我怀疑这个遗失的属性是问题的原因。
<强>更新强>
我对您的代码进行了一些测试,而不是CreatedBy
属性。相反,您的问题是您没有提供QuestionsID
值,但您在表单上包含了QuestionsID的隐藏字段。
由于QuestionsID是值类型,因此默认情况下,DataAnnotationsModelValidatorProvider
会在QuestionsID字段中添加Required验证器。由于该字段没有ValidationMessage,因此您无法看到验证错误。
您可以按照my answer here中的说明覆盖默认DataAnnotationsModelValidatorProvider的行为。