为什么我的[HttpPost]方法不会触发?

时间:2011-09-24 03:08:45

标签: asp.net-mvc-3 razor

我在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}}已执行。

请帮帮我。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您是说该表单未验证客户端,并且没有任何内容被发送回您的服务器?

意思是,你点击提交按钮,浏览器没有任何反应,对吗?

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

答案 2 :(得分:0)

QuestionsModel类包含一个未包含在视图中的属性CreatedBy

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

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

<强>更新

我对您的代码进行了一些测试,而不是CreatedBy属性。相反,您的问题是您没有提供QuestionsID值,但您在表单上包含了QuestionsID的隐藏字段。

由于QuestionsID是值类型,因此默认情况下,DataAnnotationsModelValidatorProvider会在QuestionsID字段中添加Required验证器。由于该字段没有ValidationMessage,因此您无法看到验证错误。

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