Friday, 15 May 2015

asp.net mvc - MVC5 ActionResult model being passed as empty -



asp.net mvc - MVC5 ActionResult model being passed as empty -

i have read plenty of posts issue can't seem find solution fits implementation. i'm giving mvc effort (i'm webforms guy). model beingness passed actionresult empty when should populated. i'm starring @ sample works , can find no differences. seems impossible debug too. pointers greatfully appreciated.

view:

@model webapplication1.models.siteviewmodel @{ viewbag.title = "delete site"; layout = "~/views/shared/_layout.cshtml"; } <p>are sure want delete site?</p> @using (html.beginform()) { @html.antiforgerytoken() @html.validationsummary(false) <ul class="list-group"> <li class="list-group-item"> <div class="row"> <div class="col-md-2"><b>@html.labelfor(model => model.name)</b></div> <div class="col-md-6">@model.name</div> </div> </li> <li class="list-group-item"> <div class="row"> <div class="col-md-2"><b>@html.labelfor(model => model.phase)</b></div> <div class="col-md-6">@model.phase</div> </div> </li> <li class="list-group-item"> <div class="row"> <div class="col-md-2"><b>@html.labelfor(model => model.type)</b></div> <div class="col-md-6">@model.type</div> </div> </li> </ul> <button type="submit" class="btn btn-danger">delete</button> @html.actionlink("back list", "index", null, new { @class = "btn btn-default" }) } @section scripts { @scripts.render("~/bundles/jqueryval") }

model:

public class siteviewmodel { public siteviewmodel() { services = new list<servicemodel>(); } public siteviewmodel(sitemodel site) { this.siteid = site.siteid; this.name = site.name; this.type = site.type; this.phase = site.phase; this.services = site.services; } public int siteid { get; set; } [required(errormessage = "name required")] public string name { get; set; } public schooltype type { get; set; } public schoolphase phase { get; set; } public datetime? deleted { get; set; } public virtual icollection<servicemodel> services { get; set; } }

controller action:

[httppost] public actionresult delete(siteviewmodel model) { var site = siterepository.getbyid(model.siteid); if (site == null) { throw new argumentexception(string.format("site id [{0}] not exist", model.siteid)); } seek { siterepository.softdeleteandsubmit(site); base.setsuccessmessage("the site has been (soft) deleted."); homecoming redirecttoaction("index"); } grab (exception ex) { base.seterrormessage("whoops! couldn't delete site. error [{0}]", ex.message); } homecoming view(model); }

thanks, chris.

if want fully-populated model you'll need utilize form elements or form helper functions post data.

@using(html.beginform()) { <input type="text" value="@model.name" /> // or html.textboxfor(m => m.name) ... }

the illustration linked relies on url routing rule match model's parameter. need rename siteid id or add/modify routing rule.

if need id pass parameter create intent more obvious , less prone breaking.

@using(html.beginform()) { @html.hiddenfor(m => m.id) <button type="submit">delete</button> } [httppost] public actionresult delete(int id) { var site = siterepository.getbyid(id); ... }

asp.net-mvc asp.net-mvc-5.1

No comments:

Post a Comment