Почему мой метод [HttpPost] не срабатывает? - PullRequest
2 голосов
/ 24 сентября 2011

Я создал одну страницу в виде бритвы MVC 3.0. 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 Проверка метода и запуска со стороны сервера, если я ввожу значение в поле Вопрос , затем также выполняется [HttpPost]Create .

Пожалуйста, помогите мне.

Ответы [ 3 ]

0 голосов
/ 24 сентября 2011

Вы говорите, что форма не проверяет клиентскую сторону и ничего не отправляется обратно на ваш сервер?

То есть вы нажимаете кнопку отправки, и в браузере ничего не происходит, верно?

Возможно, проблема в том, что ваша форма не проверяется ненавязчивой проверкой библиотеки JavaScript.

0 голосов
/ 24 сентября 2011

Класс QuestionsModel включает свойство CreatedBy, которое не включено в ваш просмотр.

Попробуйте добавить CreatedBy в качестве скрытого поля или (еще лучше) удалить CreatedBy изКласс QuestionsModel, поскольку он не является атрибутом, который должен отображаться в представлении.

Я подозреваю, что это отсутствующее свойство является причиной проблемы.

ОБНОВЛЕНИЕ

Я провел несколько тестов для вашего кода, и это не было свойство CreatedBy.Скорее, ваша проблема в том, что вы не предоставляете значение QuestionsID, но вы включили скрытое поле для QuestionsID в форме.

Поскольку QuestionsID является типом значения, по умолчанию DataAnnotationsModelValidatorProvider добавляет обязательный валидатор в поле QuestionsID.Поскольку поле не имело ValidationMessage, вы не могли видеть ошибку проверки.

Вы можете переопределить поведение DataAnnotationsModelValidatorProvider по умолчанию, следуя инструкциям в мой ответ здесь .

0 голосов
/ 24 сентября 2011

Я бы проверил, возникли ли какие-либо ошибки на стороне клиента при попытке отправить форму. Проверьте это из консоли браузера.

Кроме того, перед отправкой формы убедитесь, что вы завершили код без ошибок проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...