2009-08-14 2 views
2

Ich habe ein benutzerdefiniertes Ansichtsmodell, in dem ich zwei Felder und eine linq2sql-Entität habe. Alle Felder haben Validierungsattribute angehängt. Selbst wenn alle Felder ungültig sind, werden nur die Felder in der linq2sql-Klasse visuell auf Fehler hin angezeigt, und die Felder im Viewmodel werden normal angezeigt. Die Fehlermeldungen werden jedoch für alle ungültigen Felder angezeigt.Benutzerdefinierte ViewModel-Klasse - Nicht alle Felder sind als ungültig markiert, wenn kein Präfix angegeben ist

My Custom Ansichtsmodell sieht wie folgt aus:

public class BooksViewModel 
{ 
    public SelectList BookCategories { get; set; } 

    public Book Book { get; set; } 

    [Required(ErrorMessage="Field1 is required")] 
    [StringLength(10)] 
    public string Field1 { get; set; } 

    [Required(ErrorMessage = "Field2 question is required")] 
    [StringLength(100)] 
    public string Field2 { get; set; } 
} 

The Book-Klasse ist eine linq2sql Einheit, die ein MetadataType Attribut für die Validierung angebracht.

[MetadataType(typeof(BookMetadata))] 
public partial class Book 
{ 
} 
public class BookMetadata 
{ 
    [Required(ErrorMessage="Choose a category")] 
    public int CategoryID { get; set; } 

    [Required(ErrorMessage = "Title is required")] 
    [StringLength(100)] 
    public string Title { get; set; } 

    [Required(ErrorMessage = "Published date is required")] 
    [DataType(DataType.Date, ErrorMessage="Enter a valid date")] 
    public DateTime PublishedDate { get; set; } 

    [Required(ErrorMessage = "Author is required")] 
    [StringLength(50)] 
    public string Author { get; set; } 
} 

Es gibt eine AddBook-Methode im Repository mit zwei Überladungen. Man nimmt die Viewmodel und man nimmt ein Buch Typ:

public void AddBook(Book book) 
{ 
    var errors = DataAnnotationsValidationRunner.GetErrors(book); 

    if (errors.Any()) { 
     throw new RulesException(errors); 
    } 

    _db.Books.InsertOnSubmit(book); 
    _db.SubmitChanges(); 
} 

public void AddBook(BooksViewModel model) 
{ 
    var errors = DataAnnotationsValidationRunner.GetErrors(model); 

    if (errors.Any()) { 
     throw new RulesException(errors); 
    } 
} 

Das Erstellen Aktion in der Steuerung wie folgt aussieht:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Exclude = "Book.ID")]BooksViewModel booksViewModel) 
{ 
    try { 
     // Validate Book 
     _repository.AddBook(booksViewModel.Book); 
    } catch(RulesException ex) { 
     ex.AddModelStateErrors(ModelState, "Book"); 
    } 

    try { 
     // Validate other fields in the view model 
     _repository.AddBook(booksViewModel); 
    } catch (RulesException ex) { 
     ex.AddModelStateErrors(ModelState, ""); 
    } 

    if (ModelState.IsValid) { 
     return RedirectToAction("Index"); 
    } else { 
     booksViewModel.BookCategories = new SelectList(_repository.GetAllCategories().AsEnumerable(), "ID", "CategoryName", booksViewModel.Book.CategoryID); 
     return (ActionResult)View(booksViewModel); 
    } 
} 

ich xVal bin mit Client-Seite Validierungsregeln erzeugen .. Meine erstellen Ansicht das wie folgt aussieht:

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

    <fieldset> 
     <legend>Fields</legend> 
     <p> 
      <label for="Book.CategoryID">CategoryID:</label> 
      <%= Html.DropDownList("Book.CategoryID", Model.BookCategories, "Select")%> 
      <%= Html.ValidationMessage("Book.CategoryID", "*")%> 
     </p> 
     <p> 
      <label for="Book.Title">Title:</label> 
      <%= Html.TextBox("Book.Title")%> 
      <%= Html.ValidationMessage("Book.Title", "*")%> 
     </p> 
     <p> 
      <label for="Book.PublishedDate">PublishedDate:</label> 
      <%= Html.TextBox("Book.PublishedDate")%> 
      <%= Html.ValidationMessage("Book.PublishedDate", "*")%> 
     </p> 
     <p> 
      <label for="Book.Author">Author:</label> 
      <%= Html.TextBox("Book.Author")%> 
      <%= Html.ValidationMessage("Book.Author", "*")%> 
     </p> 
     <p> 
      <label for="Field1">Field1:</label> 
      <%= Html.TextBox("Field1")%> 
      <%= Html.ValidationMessage("Field1", "*")%> 
     </p> 
     <p> 
      <label for="Field2">Field2:</label> 
      <%= Html.TextBox("Field2")%> 
      <%= Html.ValidationMessage("Field2", "*")%> 
     </p> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

<div> 
    <%=Html.ActionLink("Back to List", "Index") %> 
</div> 
<%= Html.ClientSideValidation<BooksViewModel>() %> 
<%= Html.ClientSideValidation<Book>("Book") %> 

die Validierung funktionieren Client-Seite .. aber wenn ich Javascript deaktivieren und dann das Formular Fehlermeldung Post zurück für alle Felder angezeigt, aber die Field1 & Field2 sind nicht als ungültig markiert. Es gibt keine CSS-Klasse, die zu den Feldern hinzugefügt wurde, und es werden keine Span-Tags für die visuelle Fehleranzeige generiert.

Screenshot http://img22.imageshack.us/img22/324/26677634.jpg

Aber wenn ich die Ansichtsmodell Felder mit etwas

public ActionResult Create([Bind(Prefix = "VM", Exclude = "Book.ID")]BooksViewModel booksViewModel) 

und ändern Sie die Ansicht pefix dementsprechend dann funktioniert alles einwandfrei:

<p> 
    <label for="VM.Book.Title">Title:</label> 
    <%= Html.TextBox("VM.Book.Title")%> 
    <%= Html.ValidationMessage("VM.Book.Title", "*")%> 
</p> 

<p> 
    <label for="VM.Field1">Field1:</label> 
    <%= Html.TextBox("VM.Field1")%> 
    <%= Html.ValidationMessage("VM.Field1", "*")%> 
</p> 

<%= Html.ClientSideValidation<BooksViewModel>("VM") %> 
<%= Html.ClientSideValidation<Book>("Book") %> 

Was mache ich falsch hier?

Sorry für die Herstellung dieses Amt so lange ..

+0

Ein langer Post kein Problem ... info war klar und gebraucht. Upvoted! –

Antwort

1

ich glaube, das Problem könnte Ihre Variablennamen und Klassennamen identisch sind sein.

Vielleicht in Ihrem Viewmodel zu etwas umbenennen wie,

public Book BookInstance { get; set; } 

Das wird ein bisschen ein Refactoring durch erfordern, aber ich denke, es ist die Ursache für das Problem ist.

Güte,

Dan

+0

Keine Änderung des Eigenschaftsnamens macht keinen Unterschied – Zuhaib

Verwandte Themen