asp.net mvc - Is it possible to pass a ViewModel object encapsulating Person to a Create view but only receive a Person object from a POST Create action method? -


i have domain model , view model follows:

domain model:

namespace mvcapplication1.models {     public enum sex { male, female };     public class person     {         public int id { get; set; }         public string name { get; set; }          [required(errormessage="please select either female or male.")]         public sex? sex { get; set; }     } } 

view model:

namespace mvcapplication1.viewmodels {     public class homecreatevm     {         public homecreatevm()         {         }         public homecreatevm(person p)         {             person = p;             selectlist = p.sex.getselectlist();         }         public person person { get; set; }         public selectlist selectlist { get; set; }      } } 

the auxiliary extension method defined follows:

namespace mvcapplication1.models {     public static class utilities     {         public static selectlist getselectlist<xxx>(this xxx? obj) xxx : struct         {             var values = xxx x in enum.getvalues(typeof(xxx))                          select new { text = x.tostring(), value = x };             return new selectlist(values, "value", "text", obj);         }     } } 

controller:

public actionresult create() {     var p = new person();      return view(new homecreatevm(p)); }  [httppost] public actionresult create(person hc)// source of problem! {     if (modelstate.isvalid)//always false!     {         tempdata["status"] = hc;         return redirecttoaction("confirm");     }     else         return view(new homecreatevm(hc)); } 

homecreatevm.cshtml:

@model mvcapplication1.viewmodels.homecreatevm <div>     name: @html.editorfor(model => model.person.name)</div> <div>     sex: @html.dropdownlistfor(model => model.person.sex, model.selectlist, "--select--")</div> 

create view:

@model mvcapplication1.viewmodels.homecreatevm  @{     viewbag.title = "create"; }  <h2>create</h2>  <script src="@url.content("~/scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@url.content("~/scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>  @using (html.beginform()) {     @html.validationsummary(true)     <fieldset>         <legend>homecreatevm</legend>         @html.editorformodel()         <p>             <input type="submit" value="create" />         </p>     </fieldset> }  <div>     @html.actionlink("back list", "index") </div> 

question:

there no problem if post create action method accepts homecreatevm object argument. however, if change post create action method argument homecreatevm person (as shown in code above), modelstate.isvalid returns false.

the question is: "is possible pass viewmodel object create view accept domainmodel object post create action method?"

because view typed view model form fields this:

<input type="text" name="person.name" /> 

and if want bind correctly need specify prefix:

[httppost] public actionresult create([bind(prefix = "person")]person hc) {     ... } 

Comments

Popular posts from this blog

Delphi Wmi Query on a Remote Machine -