2013-05-20 16 views
5

Attualmente ho una vista che contiene due caselle di testo in cui gli utenti possono inserire alcuni dati. Una casella di testo consente solo valori di 1-10, l'altra una stringa. Non sono sicuro del codice che ho apportato, ma la seconda casella di testo che accetta una stringa non funziona più. Ad esempio, quando inserisco una stringa e provo a inviare il modulo, viene visualizzato un messaggio di convalida che indica "Il valore" (stringa) "non è valido. Di seguito sono riportati alcuni frammenti di codice nella mia soluzione.Il valore "(stringa)" non è valido

Entità:

public class MovieReview 
{ 
    public int Id { get; set; } 

    [Range(1, 10)] 
    [Required] 
    public int Rating { get; set; } 
    public string Review { get; set; } 
    public int MovieId { get; set; } 
} 

controller:

public class ReviewsController : Controller 
{ 
    private MovieLoversDb _db = new MovieLoversDb(); 

    public ActionResult Index([Bind(Prefix = "id")]int movieId) 
    { 
     var movie = _db.Movies.Find(movieId); 
     if (movie != null) 
     { 
      return View(movie); 
     } 
     return HttpNotFound(); 
    } 

    [HttpGet] 
    public ActionResult Create(int movieId) 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Create(MovieReview review) 
    { 
     if (ModelState.IsValid) 
     { 
      _db.MovieReviews.Add(review); 
      _db.SaveChanges(); 
      return RedirectToAction("Index", new { id = review.MovieId }); 
     } 
     return View(review); 
    } 

parziale Vista:

@model MovieLovers.Models.MovieReview 

@{ 
    ViewBag.Title = "Review a Movie"; 
} 

<h2>Review a Movie</h2> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

<fieldset> 
    <legend>New Review</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Rating) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Rating) 
     @Html.ValidationMessageFor(model => model.Rating) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Review) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Review) 
     @Html.ValidationMessageFor(model => model.Review) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.ReviewerName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.ReviewerName) 
     @Html.ValidationMessageFor(model => model.ReviewerName) 
    </div> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

La domanda n è, cosa sto sbagliando? Perché questo errore di convalida genera?

+0

Penso che tu abbia pubblicato un'altra vista. La tua vista pubblicata mostra solo la lista. Ho ragione? –

+0

Sì, mi scuso. Aggiornamento ora. –

+0

Avete un altro campo sulla pagina renderizzata chiamato 'Review'? – Jasen

risposta

5

ho capito con un suggerimento di Jasen nei commenti sotto il post originale. Sembra che "Revisiona" possa essere stato usato due volte, sebbene non sia stato possibile trovare dove. Ho cambiato il nome della proprietà in "body" e ora funziona.

Grazie per tutto il vostro aiuto!

+2

Le due volte sono la proprietà "MovieReview.Review" e il parametro di azione "(Revisione MovieReview)". – Foole

0

Penso che in seguito model.Review e Model.Rating non possono essere direttamente accessibili come modalità è IEnumerable

 <th> 
     @Html.DisplayNameFor(model => model.Rating) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.Review) 
    </th> 
+0

Ho rimosso "IEnumerable" e visualizza ancora il messaggio di convalida. Lo stesso vale per l'azione Modifica che ho recentemente creato per questo. –

-1

Rimuovere il @Html.ValidationSummary(true)

o

rimuovere tutti ValidationMessageFor e il cambiamento per (rimuovere true) @Html.ValidationSummary()

Modifica:

si vuole essere rimuovere tutti ValidationMessageFor e cambiare il ValidationSummary(true)-ValidationSummary()

+0

Questa operazione rimuoverà quindi la convalida su questi moduli? –

+0

Si desidera rimuovere tutto ValidationMessageFor e modificare ValidationSummary (true) in ValidationSummary() –

1

Si prega di provare a utilizzare

public class MovieReview 
{ 
    public int Id { get; set; } 

    [Range(1, 10)] 
    [Required] 
    public int Rating { get; set; } 
    public string? Review { get; set; } 
    public int MovieId { get; set; } 
} 
+0

Impossibile. Sto usando MovieReview in un tipo generico su un'altra entità. Ottengo un errore affermando che questo campo non può essere nullo. –

+0

Le stringhe sono già annullabili – Jasen

+0

Hai usato EF. Destra? E l'avvicinarsi è il primo modello? – thangchung

1

Non funziona perché la classe del dominio ha una proprietà denominata Review (public string Review { get; set; }) e il metodo che riceve la classe di dominio aggiornata ha anche il parametro denominato review (public ActionResult Create(MovieReview review)).

Modifica public ActionResult Create(MovieReview review) a public ActionResult Create(MovieReview movieReview).

2

il problema è il nome del campo è recensione:

@ Html.EditorFor (modello => modello.Review)

come il nome del parametro nel controllo:

ActionResult pubblico creare (recensione MovieReview)

Cambiare il nome del parametro dovrebbe lavora troppo

0

il tuo nome var non dovrebbe essere lo stesso di un nome classe prova questo:

public class MovieReview 
{ 
    public int Id { get; set; } 

    [Range(1, 10)] 
    [Required] 
    public int ratingId { get; set; } 
    public string reviewText { get; set; } 
    public int movieId1 { get; set; } 
} 
Problemi correlati