Как проверить с ASP.NET MVC - Недопустимое состояние модели при отправке формы - PullRequest
1 голос
/ 28 апреля 2010

Я пытаюсь проверить форму в MVC.

Я добавляю собственные ошибки в состояние модели и получаю их как недействительные при отправке формы. Когда отображается представление, оно не показывает ни сообщения проверки, ни сводку проверки. Может кто-нибудь, пожалуйста, дайте мне знать, что я делаю неправильно, или укажите мне правильное направление, если есть какой-либо другой способ проверки?

Редактировать Это ASP.NET MVC 1. Вот код:

Ниже следует сущность

namespace DCS.DAL.Entities
{
    public class Group : IDataErrorInfo
    {
        public int GroupId { get; set; }

        public string GroupName { get ; set; }
        public string AboutText { get; set; }
        public string LogoURL { get; set; }
        public string FriendlyURL { get; set; }
        public bool ExcludeFromFT { get; set; }
        public ContactInfo ContactInfo { get; set; }

        public string Error { get { return string.Empty;  } }

        public string this[string propName]
        {
            get
            {
                if ((propName == "GroupName") && string.IsNullOrEmpty(GroupName))
                    return "Please enter Group Name";
                return null;
            }
        }


    }
}

Ниже приводится представление

<%= Html.ValidationSummary("Please correct following details") %>  

    <% using (Html.BeginForm()) {%>

    <div id="divError" Style="display:none;">
        errors 
        <%
                foreach (KeyValuePair<string, ModelState> keyValuePair in ViewData.ModelState)
                {
                    foreach (ModelError modelError in keyValuePair.Value.Errors)
                    {
            %> 
                         <% Response.Write(modelError.ErrorMessage); %>
            <%
                    }
                }
            %>   
    </div>

        <fieldset>

            <table>
                <tr>
                    <td>
                        <label for="GroupName">Group Name:</label>
                    </td>
                    <td>
                        <%= Html.TextBox("GroupName", Model.GroupName) %>
                        <%= Html.ValidationMessage("GroupName","group") %>
                    </td>

Цикл Foreach предназначен для тестирования, он попадает в цикл for, но не отправляет сообщение об ошибке response.write, ни сводку проверки, ни сообщение проверки.

Следующий контроллер

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult EditGroup(Group group, FormCollection collection)
        {
            //Group group = new Group();
            bool success = false;
            try
            {

                    var contactInfo = new ContactInfo
                                          {

                                              ContactName = collection["ContactName"],
                                              Email = collection["Email"],
                                              Fax = collection["Fax"],
                                              HeadOfficeAddress = collection["HeadOfficeAddress"],
                                              Freephone = collection["Freephone"],
                                              Telephone = collection["Telephone"],
                                              Website = collection["Website"]
                                          };

                group.ContactInfo = contactInfo;
                group.GroupName = collection["GroupName"];
                if(string.IsNullOrEmpty(group.GroupName))
                {
                    ModelState.AddModelError("GroupName", "Please enter group name");

                }

                if (!ModelState.IsValid)
                {
                    success = groupRepository.InsertUpdateGroup(group);
                    return View(group);
                }

            }
            catch
            {

            }

            //return Json(success);
            return View(group);
        }

Он входит в цикл if(!Modelstate.isvalid), но не отображает ошибку.

Редактировать 2 Я вижу в текстовом визуализаторе, что в Сводке проверки есть сообщение об ошибке, хотя оно не будет отображаться на экране.

Спасибо

1 Ответ

2 голосов
/ 28 апреля 2010

Вы можете украсить свойства вашей модели с помощью атрибутов аннотации данных, что позволит вам выполнить некоторую логику проверки. Вот упрощенный пример:

Модель:

public class Group
{
    [Required]
    public string GroupName { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new Group());
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(Group group)
    {
        // Remark: You don't need the FormCollection as argument to this action,
        // leave the default model binder do the job - it will also work
        // for the ContactInfo property as long as you name your text fields 
        // appropriately. For example Html.TextBox("ContactInfo.Email", Model.ContactInfo.Email)
        return View(group);
    }
}

Вид:

<% using (Html.BeginForm()) { %>
    <label for="GroupName">Group Name:</label>
    <%= Html.TextBox("GroupName", Model.GroupName) %>
    <%= Html.ValidationMessage("GroupName", "group") %>
    <input type="submit" value="Post" />
<% } %>

Вам решать, достаточны ли аннотации данных для вашего случая, но имейте в виду, что если вам нужно выполнить более сложные сценарии проверки, вы можете взглянуть на сторонние фреймворки, такие как FluentValidation и xVal .

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