Проверка выпадающего списка в MVC3? - PullRequest
2 голосов
/ 06 февраля 2012

Я работаю в MVC3 с Entity Framework. У меня есть объект с именем Product, у которого есть два свойства, которые я хотел бы проверить, когда пользователь добавляет новую запись. Для этого я создал класс собеседника, например:

using System;
using System.ComponentModel.DataAnnotations;

namespace Rpm.Data.Partials
{
    [MetadataType(typeof(ProductMetadata))]
    public partial class Product
    {
    }
}

Класс метаданных выглядит так:

using System;
using System.ComponentModel.DataAnnotations;

namespace Rpm.Data.Partials
{
    public class ProductMetadata
    {
        [Required]
        public string ProductName { get; set; }

        [Range(200, 1000, ErrorMessage = "You must select a valid Account Type")]
        public int AccountTypeId { get; set; }
    }
}

Представление, позволяющее пользователям добавлять новую запись, выглядит следующим образом:

@model Rpm.Data.Product

@{
    ViewBag.Title = "Product"
}

<script type="text/javascript">
    $(document).ready(function() {
        //There should be no selection in the drop-down box when the form is first displayed.
        document.getElementsByTagName("select")[0].selectedIndex = -1;
    }

    function formSubmit() {
        var form = $("form");

        if (form.valid()) {
            (event.preventDefault) ? event.preventDefault() : event.returnValue = false;
            document.getElementById("frmNewProduct").submit();
            return true;
        }
        else {
            return false;
        }
    }
</script>

<h2>Add New Product</h2>

@using (Html.BeginForm("Create", "Product", new { id = new Product() }, FormMethod.Post, new { id = "frmNewProduct" }))
{
    @Html.ValidationSummary(true)
    <table>
        <tr>
            <td>
                Product Name
            </td>
            <td>
                @Html.TextBoxFor(m => new Product().ProductName)
                @Html.ValidationMessageFor(m => new Product().AccountTypeId)
            </td>
        </tr>
        <tr>
            <td>
                Account Type
            </td>
            <td>
                @Html.DropDownListFor(m => new Product().AccountTypeId, new SelectList(Lookup.Instance.AccountTypes, "AccountTypeId", "AccountTypeName"))
                @Html.ValidationMessageFor(m => new Product().AccountTypeId)
            </td>
        </tr>
        <tr>
            <td />
            <td>
                <input type="image" src="@Url.Content("~/Content/images/savebutton.png")" onclick="return formSubmit()" />
            </td>
        </tr>
    </table>
}

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

Проблема в том, что когда пользователь нажимает кнопку «Сохранить», проверка для ProductName запускается очень хорошо и отображает сообщение проверки, если поле пустое; однако сообщение для AccountTypeId никогда не отображается, даже если раскрывающийся список остается без выбора (selectedIndex == -1). Я знаю, что RangeAttribute для AccountTypeId выбирается, потому что, когда EF пытается сохранить изменения в сущностях, он выдает DbEntityValidationException, а текст ErrorMessage - это пользовательское сообщение об ошибке, которое я указал в метаданных. Я просто не могу заставить его отображаться на странице и привести к сбою проверки формы, что не позволяет пользователю сохранять.

Любые предложения относительно того, что я делаю не так, будут наиболее ценными!

ТИА

Jeff

1 Ответ

2 голосов
/ 07 февраля 2012

Когда вы делаете это:

@Html.TextBoxFor(m => new Product().ProductName) 
@Html.ValidationMessageFor(m => new Product().AccountTypeId) 

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

Тип вашей модели уже продукт.Вы должны просто использовать m => m.ProductName

Это может сбить с толку систему проверки.Я бы просто сделал, как я советую, и посмотрю, не исчезнет ли проблема.

Вам также не нужен javascript для установки типа выпадающего списка.Просто сделайте это:

@Html.DropDownListFor(m => new Product().AccountTypeId, 
     new SelectList(Lookup.Instance.AccountTypes, 
         "AccountTypeId", "AccountTypeName"), "Select") 

И убедитесь, что AccountTypeId имеет значение null int, и вы добавили в него атрибут [Required].Валидатор удостоверится, что есть значение.

Я также не уверен, почему вы используете код formSubmit.входы изображений уже отправляют типы, поэтому они отправляют форму, когда вы нажимаете на них.Похоже, вы на самом деле не делаете ничего, кроме повторной отправки формы.

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