asp.net mvc - C# How to initilization a variable in class? -
i'm creating billing address user shipping including (first name, last name, address 1, address 2...) based on mvc music store project
[httppost] public actionresult addressandpayment(formcollection values) { var order = new salesorderheader(); var order1 = new salesorderdetail(); tryupdatemodel(order); try { if (string.equals(values["promocode"], promocode, stringcomparison.ordinalignorecase) == false) { return view(order); } else { order.accountnumber = user.identity.name; order.orderdate = datetime.now; order.address.addressline1 = values["addressline1"]; order.address.addressline2 = values["addressline2"]; order.address.city = values["city"]; //save order bikedbs.salesorderheaders.add(order); bikedbs.savechanges(); //process order var cart = shoppingcart.getcart(this.httpcontext); cart.createorder(order); //cart.createorder(order1); return redirecttoaction("complete", new {id = order.salesorderid }); } } catch { //invalid - redisplay errors return view(order); } }
may have ask dump question? initial order.address variable? address string type. updated code following metioned. based on mvc music store project , created new app using adventurework2012 db. here view:
<h2>address , payment</h2> <fieldset> <legend>shipping information</legend> @html.displaynamefor(model => model.customer.person.firstname): @html.textbox("firstname") <br /> @html.displaynamefor(model => model.customer.person.lastname): @html.textbox("lastname") <br /> @html.displaynamefor(model => model.address.addressline1): @html.textbox("addressline1") <br /> @html.displaynamefor(model => model.address.addressline2): @html.textbox("addressline2") <br /> @html.displaynamefor(model => model.address.city): @html.textbox("city") <br /> </fieldset> and address.cs:
public partial class address { public address() { this.salesorderheaders = new hashset<salesorderheader>(); this.salesorderheaders1 = new hashset<salesorderheader>(); } public int addressid { get; set; } public string addressline1 { get; set; } public string addressline2 { get; set; } public string city { get; set; } public int stateprovinceid { get; set; } public string postalcode { get; set; } public system.guid rowguid { get; set; } public system.datetime modifieddate { get; set; } public virtual stateprovince stateprovince { get; set; } public virtual icollection<salesorderheader> salesorderheaders { get; set; } public virtual icollection<salesorderheader> salesorderheaders1 { get; set; } }
in c# string null if not initialized.
in mvc music store project, can follow code:
the addressandpayment view shows shipping information has helper @html.editorformodel() , view model of type mvcmusicstore.models.order.
following class name see properties exposed in form.
and 1 of properties in fact address written as
[required(errormessage = "address required")] [stringlength(70)] public string address { get; set; } as action accepting formcollection instead of model, need do:
order.address = values["address"]; updated new code on question
there's 3 small mistakes code:
1 - code using tryupdatemodel , can't use complex types (your new address object complex object , not primitive 1 (string, int, etc))
2 - because of point 1, need comment out tryupdatemodel , instead, pass order input public actionresult addressandpayment(order order, formcollection values)
3 - in view, rendering new properties @html.textbox("addressline1") explicit name of <input> addressline1 witch it's wrong model, should address.addressline1.
to fix this, use helper editorfor , use like:
@html.displaynamefor(model => model.customer.person.firstname): @html.editorfor(model => model.customer.person.firstname) <br /> @html.displaynamefor(model => model.customer.person.lastname): @html.editorfor(model => model.customer.person.lastname) <br /> @html.displaynamefor(model => model.address.addressline1): @html.editorfor(model => model.address.addressline1) <br /> @html.displaynamefor(model => model.address.addressline2): @html.editorfor(model => model.address.addressline2) <br /> @html.displaynamefor(model => model.address.city): @html.editorfor(model => model.address.city) <br /> this create <input> like
<input class="text-box single-line" id="address_addressline1" name="address.addressline1" type="text" value=""> instead 1 have:
<input id="addressline1" name="addressline1" type="text"> now, default action, work out of box, without need updated, when save order, have fields form in order object
[httppost] public actionresult addressandpayment(order order, formcollection values) { try { if (string.equals(values["promocode"], promocode, stringcomparison.ordinalignorecase) == false) { return view(order); } else { order.username = user.identity.name; order.orderdate = datetime.now; //save order storedb.orders.add(order); storedb.savechanges(); //process order var cart = shoppingcart.getcart(this.httpcontext); cart.createorder(order); return redirecttoaction("complete", new { id = order.orderid }); } } catch { //invalid - redisplay errors return view(order); } }
Comments
Post a Comment