2011-09-24 109 views
2

我已经在MVC 3.0 Razor视图中创建了一个页面。 Create.cshtml为什么我的[HttpPost]方法不会触发?

@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执行输入值,那么它会执行从服务器端[HttpPost]Create法和火验证。

请帮帮我。

+1

我可能会脱节,但你是否包括jquery库的核心?我只在这里看到验证插件,但没有看到库。 –

回答

0

QuestionsModel类包括属性CreatedBy它不包含在您的视图。

尝试将CreatedBy作为隐藏字段添加,或者(更好)从ProblemsModel类中删除CreatedBy,因为它不是应该在视图中公开的属性。

我怀疑这个缺失的属性是问题的原因。

UPDATE

我跑在你的代码的一些测试,它不是CreatedBy属性。相反,您的问题是您没有提供QuestionsID值,但是您在表单上包含了一个用于QuestionsID的隐藏字段。

由于QuestionsID是一个值类型,因此DataAnnotationsModelValidatorProvider默认将一个Required验证程序添加到QuestionsID字段。由于该字段没有ValidationMessage,因此您看不到验证错误。

您可以按照my answer here中的说明覆盖默认DataAnnotationsModelValidatorProvider的行为。

+0

它不应该导致它。 – tugberk

+0

不,这是不是问题的原因,因为我有几个其他形式,其中包含一些字段,我没有在我的视图中使用,但仍然工作。 – imdadhusen

0

我会检查尝试提交表单时是否发生任何客户端错误。从浏览器控制台检查它。

此外,在提交表单之前,请确保您已完成没有验证错误的代码。

+0

没有表格验证客户端工作正常,但如果我填写所有必填字段,然后按提交按钮,然后它不会得到回传。即使我没有在浏览器中得到任何验证错误 – imdadhusen

0

你是说窗体不验证客户端,也没有任何东西被发回到你的服务器?

意思是,你点击提交按钮,浏览器中没有任何事情发生,对不对?

问题可能是您的表单未通过不显眼的JavaScript库验证进行验证。

+0

没有表单验证客户端工作正常,但如果我填写所有必填字段,然后按提交按钮,然后它不会得到回传。即使我没有在浏览器中得到任何验证错误 – imdadhusen

相关问题