asp.net mvc - Razor will not render hidden accurate PK in HiddenFor -
asp.net mvc - Razor will not render hidden accurate PK in HiddenFor -
running weird problem in asp mvc 4 site. if user opens create
form , attempts add together agent our database, naturally run validation on fields first. if there error, save agent in incomplete status, , redirect user create page.
the error comes when user attempts re-save agent. on first post-back, agent saved database , pk generated. on sec post-back, however, pk beingness sent server value of 0
instead of auto-generated.
i've added hiddenfor
on create
view, renders value of 0
each , every time.
i've stepped through code create sure pk beingness generated after .save
called, still nowadays when return view
called , ensured model.id
property contains same value when view beingness rendered.
regardless, if right click page , view source, hidden field renders so:
<input data-val="false" data-val-number="the field id must number." data-val-required="the id field required." id="id" name="id" type="hidden" value="0" />
model
public partial class agenttransmission { public int id { get; set; } . . . }
view
@model monetmodelfromdb.models.agenttransmission @{ viewbag.title = "create new agent"; } @html.hiddenfor(model => model.createddate, new { data_val = "false" }) @html.hiddenfor(model => model.createdoperator, new { data_val = "false" }) @html.hiddenfor(model => model.referencenumber, new { data_val = "false" }) @html.hiddenfor(model => model.region, new { data_val = "false" }) @html.hiddenfor(model => model.inddist, new { data_val = "false" }) @html.hiddenfor(model => model.lastchangedate, new { data_val = "false" }) @html.hiddenfor(model => model.lastchangeoperator, new { data_val = "false" }) @html.hiddenfor(model => model.edittaxid, new { data_val = "false" }) @html.hiddenfor(model => model.parentid, new { data_val = "false" }) @html.hiddenfor(model => model.issubstat, new { data_val = "false" }) @html.hiddenfor(model => model.id, new { data_val = "false" })
rendered hiddenfor section
<input data-val="false" data-val-date="the field createddate must date." id="createddate" name="createddate" type="hidden" value="" /> <input data-val="false" id="createdoperator" name="createdoperator" type="hidden" value="" /> <input data-val="false" id="region" name="region" type="hidden" value="nm-834" /> <input data-val="false" id="inddist" name="inddist" type="hidden" value="834" /> <input data-val="false" data-val-date="the field lastchangedate must date." data-val-required="the lastchangedate field required." id="lastchangedate" name="lastchangedate" type="hidden" value="4/8/2015 10:43:30 am" /> <input data-val="false" id="lastchangeoperator" name="lastchangeoperator" type="hidden" value="typcls" /> <input data-val="false" data-val-required="the edittaxid field required." id="edittaxid" name="edittaxid" type="hidden" value="false" /> <input data-val="false" data-val-number="the field parentid must number." id="parentid" name="parentid" type="hidden" value="" /> <input data-val="false" data-val-required="the issubstat field required." id="issubstat" name="issubstat" type="hidden" value="false" /> <input data-val="false" data-val-number="the field id must number." data-val-required="the id field required." id="id" name="id" type="hidden" value="0" />
controller
[httppost] [monetauthorize] public actionresult create(agenttransmission agenttransmission, bool andaddagent = false) { . . . //determine if first post or not if (agenttransmission.id > 0) { db.entry(agenttransmission).state = entitystate.modified; } else { db.agenttransmission.add(agenttransmission); } db.savechanges(); //send view if errors pressent if (!string.isnullorwhitespace(errormsg)) { homecoming view(agenttransmission); } }
edit
if remove hiddenfor
helper , cut/paste rendered input
tag, i'm able capture corret pk value. however, little hacky hoping find more elegant solution (if possible)
<input data-val="false" id="id" name="id" type="hidden" value="@model.id" />
variations on question asked here frequently. boils downwards modelstate
object , fact values override values on actual model view. when post form, 0
set in modelstate
object id
property. in post action, save entity, causes id
property updated, 0
still in modelstate
. when homecoming view, 0
set value id
again, because, again, that's what's in modelstate
.
the reason why works way best explained example. let's have form you're editing existing entity, has name
property that's set "foo". user changes in form "bar" , posts form. however, neglected fill in required field, error prevents update beingness saved. should happen @ point? if utilize model value, name
field reset "foo". however, if modelstate
used, name
field retains user's modification of "bar". in latter case, simply prepare error , post again. in former, must remake changes made form previously, poor user experience.
now, how prepare this. best way follow prg pattern (post-redirect-get). if submission good, , saved changes successfully, don't homecoming view, if want user able create additional changes. if want that, redirect same action, redirect process plenty clear modelstate
user interacting updated model pulled fresh database.
if that's not doable, can clear modelstate
. advise against clearing completely, can cause real user frustration detailed in illustration above. if can't redirect, seek clear values in modelstate
need to.
modelstate.remove("id");
asp.net-mvc entity-framework asp.net-mvc-4 razor
Comments
Post a Comment