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

Popular posts from this blog

java - How to set log4j.defaultInitOverride property to false in jboss server 6 -

c - GStreamer 1.0 1.4.5 RTSP Example Server sends 503 Service unavailable -

Using ajax with sonata admin list view pagination -