ASP.NET MODE MODELLA MODELLO BUG: RICHIESTA BINGAGGIO Variabile "ID" alla proprietà del modello "ID"

StackOverflow https://stackoverflow.com/questions/5358913

Domanda

Sto usando MVC 3 Final RTM.

Dato

Questo percorso:

context.MapRoute(
    "Blog_Posts",
    "Blog/Posts/{id}/{slug}",
    new { controller = "Posts", action = "Index", slug = UrlParameter.Optional }
);

E sulla pagina di un post, EG/Blog/Post/2/Some Slug I Lega una vista parziale con a Comment modello:

@Html.Partial("_CommentEditor", new Comment())

E Comment ha un public int Id {get; set;}.

E nella visione parziale, ho questo:

@Html.HiddenFor(comment => comment.Id)

Perché mostra questo?

<input type="hidden" value="2" name="Id" id="Id" data-val-required="The Id field is required." data-val-number="The field Id must be a number." data-val="true">

E perché quando cambio Id Su Comment a CommentId Ha correttamente un valore di 0?

Io penso che il legante del modello predefinito sia vincolante a {id} del percorso.

È stato utile?

Soluzione

Ciò accade perché quando si utilizzano aiutanti HTML come nascosti per la prima volta che guardano i dati del percorso e lo stato del modello e successivamente nel modello. Quindi trovano nei dati del percorso un parametro ID = 2 e usano questo valore anziché l'ID = 0 nel modello che stai passando.

Altri suggerimenti

È un bug o potrebbe non essere a causa della logica implementata di seguito;

In ASP.NET MVC, un motore di visualizzazione utilizza ViewData (È variabile e il suo tipo è "ViewDataDictionary"). E questo ViewData Ha 2 proprietà "ModelState" che contiene valori di routing e "modello" che contiene il nostro oggetto modello effettivo.

  1. Un motore di visualizzazione esamina il valore di recupero degli oggetti "ModelState" di una proprietà.
  2. Se trovato nel passaggio 1, il valore di restituzione.
  3. Altrimenti esamina l'oggetto "Modello" per recuperare il valore per una proprietà.

Nel caso sopra, Route ha la proprietà "ID" e il suo valore viene salvato in "ModelState", quindi restituisce il valore da "ModelState" anziché dal modello vincolato.

Per lo scenario di cui sopra, qualsiasi controllo di input rende un valore imprevisto.

La risoluzione è:

<div class="postData" value='@Model.Id'/>

//use below jquery function to retrieve data
var postedData = $('.postData');

Se si utilizza Linq a SQL, i campi contrassegnati come fornito dal database non possono essere impostati manualmente.

Provare:

Try @Html.Partial("_CommentEditor", new Comment{Id = 0}) 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top