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
Post a Comment