Я работаю в 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