3 Stimmen

asp.net mvc 3 Validierung für Id-Feld mit EF-Code zuerst

Ich habe das folgende Modell:

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; }
}

und das folgende Paar von Add-Methoden in der Steuerung:

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

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

  return RedirectToAction("Index");
}

Dies ist die Ansicht Hinzufügen:

@using Models
@model Product

<h2>Add Product</h2>

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

Alles wird gut angezeigt, leider kann ich das Formular nicht abschicken. Ich habe eine Weile gebraucht, um herauszufinden, dass das Feld Id validiert wird. In der Tat, wenn ich die HiddenInput Attribut kann ich beim Absenden sehen, dass das Feld Id erforderlich ist.

Gibt es eine Möglichkeit, sie als nicht erforderlich zu markieren und trotzdem EditorForModel() ?

7voto

counsellorben Punkte 10814

Wenn Sie den Primärschlüssel als Teil des Modells beibehalten müssen, dann müssen Sie den Standard für DataAnnotationsModelValidatorProvider dass Wertarten erforderlich sind. Fügen Sie Folgendes zur Methode Application_Start in Global.asax.cs :

ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

1voto

Eranga Punkte 31803

Sie sollten die Verwendung von Ansichtsmodellen in Betracht ziehen, anstatt Ihre Domänenentitäten als Modelle an Ansichten zu senden.

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

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

Dann verwenden Sie ein Tool wie AutoMapper um das Ansichtsmodell auf Ihr Domänenmodell abzubilden

[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");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X