Проверка asp.net MVC 3 для поля Id с кодом EF сначала - PullRequest
3 голосов
/ 06 сентября 2011

У меня есть следующая модель:

public class Product
{
  [Key]
  [HiddenInput(DisplayValue = false)]
  public int Id { get; set; }

  [Required]
  [StringLength(10)]
  public string ProductCode { get; set; }

  [Required]
  [StringLength(40)]
  public string ProductName { get; set; }
}

и следующая пара методов Add в контроллере:

[HttpGet]
public ActionResult Add()
{
  return View();
}

[HttpPost]
[ValidateInput(false)]
[ValidateAntiForgeryToken]
public ActionResult Add(Product product)
{
  productRepository.Add(product);

  return RedirectToAction("Index");
}

Это вид Добавить:

@using Models
@model Product

<h2>Add Product</h2>

@using (@Html.BeginForm("Add", "Home")) {
  @Html.AntiForgeryToken()
  @Html.EditorForModel()
  <input type="submit" id="btnSubmit" value="Submit"/>
}

Все отображается нормально, к сожалению, я не могу отправить форму. Мне потребовалось некоторое время, чтобы понять, что поле Id проверяется. Действительно, если я удалю атрибут HiddenInput, то при отправке я увижу, что он говорит, что поле Id является обязательным.

Есть ли способ пометить его как необязательный при использовании EditorForModel()?

Ответы [ 2 ]

7 голосов
/ 06 сентября 2011

Если вы должны сохранить первичный ключ как часть модели, то вам необходимо переопределить значение по умолчанию для DataAnnotationsModelValidatorProvider, что требуются типы значений.Добавьте следующее в метод Application_Start в Global.asax.cs:

ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
1 голос
/ 06 сентября 2011

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

public class ProductAddModel
{
  [Required]
  [StringLength(10)]
  public string ProductCode { get; set; }

  [Required]
  [StringLength(40)]
  public string ProductName { get; set; }
}

Затем используйте такой инструмент, как AutoMapper , чтобы сопоставить модель представления с моделью вашего домена

[HttpPost]
[ValidateInput(false)]
[ValidateAntiForgeryToken]
public ActionResult Add(ProductAddModel productAddModel)
{
  if (ModelState.IsValid)
  {
      Product product = Mapper.Map<ProductAddModel, Product>(productAddModel);

      productRepository.Add(product);
  }

  return RedirectToAction("Index");
}
...