asp.net mvc Проверка на стороне сервера данных не возвращается - PullRequest
0 голосов
/ 07 марта 2012

Я создаю форму проверки в моем приложении. В этой форме есть две кнопки. Один принять, а другой отказаться. Когда пользователь нажимает «отклонить», необходимо указать поле причины отклонения. Я проверяю это на стороне сервера. Сначала я проверяю, какая кнопка нажата, а затем, если поле пустое, я добавляю ошибку моделя в состояние модели. Но, поскольку все поля в форме доступны только для чтения, они не отправляются обратно на сервер, и поэтому, когда я возвращаю представление обратно пользователю, данных нет. Я, наверное, упускаю что-то очевидное, но не могу найти, что делать. (Я знаю, что могу сделать все поля в моей форме скрытыми, но из-за большого количества полей это было бы действительно ужасно)

Это мой код.

    [HttpPost]
    public virtual ActionResult Validate(string action, Record dto) {

        if(action == Global.Accept) {
            ciService.Store(dto);
            return RedirectToAction("Index", "Ci");
        } else {
            if(string.IsNullOrEmpty(dto.RejectionReason)) {
                ModelState.AddModelError("RejectionReason", "REQUIRED!!!!");
                return View("Validate", dto);


            }
            ciService.Reject(dto);
            return RedirectToAction("Index", "Ci");
        }
    }

Ответы [ 5 ]

2 голосов
/ 07 марта 2012

Вам необходимо заново создать модель из базы данных, а затем изменить ее так, чтобы она соответствовала любым изменениям, опубликованным в dto. Затем используйте эту комбинированную модель в представлении.

1 голос
/ 07 марта 2012

Вместо того, чтобы передавать DTO из браузера, я бы использовал скрытое поле HTML или параметр строки запроса, содержащий идентификатор, который идентифицирует DTO. Тогда ваш метод действия POST будет выглядеть примерно так:

[HttpPost]
public virtual ActionResult Validate(string action, int id)
{
    // reload the DTO using the id
    // now you have all the data, so just process as you did in your question

    if (action == Global.Accept) { ... }
    ...
}

Тогда ваш метод GET может выглядеть примерно так:

[HttpGet]
public virtual ActionResult Validate(int id)
{
    // load the DTO and return it to the view

    return View();
}

Таким образом, у вас есть все данные, которые вам нужны в вашем методе действия POST, чтобы делать все, что вам нужно.

0 голосов
/ 07 марта 2012

Если вам не нужны эти поля на стороне сервера, просто создайте новый ViewModel RecordValidateViewModel, и он содержит только те поля, которые необходимо проверить.Связыватель модели будет заполнен, и у вас будет проверка только для полей в этой модели, а не для всех других полей, которые вам там не нужны.

Если они нужны для проверки, отправьте их обратнона сервер.Это не «некрасиво», если скрыто.

0 голосов
/ 07 марта 2012

Если я правильно понимаю, проблема в том, что вы не используете ввод. Чтобы решить вашу проблему, вставьте в форму некоторые скрытые данные со значением, которое необходимо передать контроллеру

 @Html.HiddenFor(model => model.Myfield1) 
 @Html.HiddenFor(model => model.Myfield2) 

это должно исправить значения, не переданные обратно вашим действиям

0 голосов
/ 07 марта 2012

Вам необходимо иметь скрытые поля, соответствующие каждому свойству, отображаемому в пользовательском интерфейсе.

например.,

@Html.LabelFor (m => m.MyProperty) - для отображения

@Html.Hiddenfor (m => m.MyProperty) - ToPostback значение на сервер

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