How to preserve model values during postback? - asp.net-mvc

I have a model:
public class EmployeeDetails
{
public int staffcode { get; set; }
public string name { get; set; }
public string designation { get; set; }
public string department { get; set; }
}
On click of Search button, employee details are fetched from the database and model properties are initialized. These values are also shown on the View.
dtEmpDetails = lib.RunSP("GetEmpDetails", lstEmpDetails);
leaveBalanceViewModel.EmployeeDetail.staffcode = Convert.ToInt32(staffCode);
leaveBalanceViewModel.EmployeeDetail.name = dtEmpDetails.Rows[0][0].ToString();
leaveBalanceViewModel.EmployeeDetail.designation = dtEmpDetails.Rows[0][1].ToString();
There is another button Save. When I click Save, the Textbox values from the View get lost because again a Submit is happening.
How can I store the model property values and keep it available during postbacks?
** Edited **
View Code is as below:
<div>
#using (Html.BeginForm("Search", "AFLeaveBalance",FormMethod.Get))
{
<table style="border:none">
<tr>
<td style="border:none">Enter staff code</td>
<td style="border:none">#Html.TextBox("staffcode", "", new { width = "100" })</td>
<td style="border:none"><input type="submit" value="Get Details" /></td>
</tr>
</table>
}
<br /><hr />
<table id="tblEmpDetails">
<tr>
<td style="background-color:#d2eef7; width:200px;text-align:left">Employee Name</td>
<td>#Html.TextBoxFor(m => m.EmployeeDetail.name, new { #readonly = "ReadOnly", #class = "ReadOnly", style = "width:300px" })</td>
#Html.HiddenFor(m => m.EmployeeDetail.name)
</tr>
<tr>
<td style="background-color:#d2eef7;width:200px;text-align:left">Designation</td>
<td >
#Html.TextBoxFor(m => m.EmployeeDetail.designation, new { #readonly = "ReadOnly", #class = "ReadOnly", style="width:300px" })
</td>
</tr>
<tr>
<td style="background-color:#d2eef7;width:200px;text-align:left">Directorate</td>
<td>#Html.TextBoxFor(m => m.EmployeeDetail.directorate, new { #readonly = "ReadOnly", #class = "ReadOnly", style = "width:300px" })</td>
</tr>
</table>
<br /><hr />
#using (Html.BeginForm("Save", "AFLeaveBalance", FormMethod.Post))
{
<table id="tblCurrentYear">
<tr style="background-color:#d2eef7;color:Black;font-weight:200">
<td colspan="4">
#Html.Label("Year: " + DateTime.Now.Year.ToString())
</td>
</tr>
<tr style="background-color:#d2eef7;color:Black;">
<td>Leave Type</td>
<td>Leave Taken</td>
<td>Leave Balance</td>
<td>Leave Total</td>
</tr>
#*#for (int i = 0; i < Model.LeaveDetailsList.Count; i++)*#
#*{*#
<tr>
<td>#Html.TextBoxFor(m => m.LeaveDetailsList[0].LeaveType, new { #class = "ReadOnly", #readonly = "readonly", style = "width:80px; text-align:center" })</td>
<td>#Html.TextBoxFor(m => m.LeaveDetailsList[0].LeaveTaken, new { width = "100" })</td>
<td>#Html.TextBoxFor(m => m.LeaveDetailsList[0].LeaveBalance, new { width = "100" })</td>
<td>#Html.TextBoxFor(m => m.LeaveDetailsList[0].LeaveTotal, new { width = "100" })</td>
</tr>
<tr>
<td>#Html.TextBoxFor(m => m.LeaveDetailsList[1].LeaveType, new { #class = "ReadOnly", #readonly = "readonly", style = "width:80px; text-align:center" })</td>
<td>#Html.TextBoxFor(m => m.LeaveDetailsList[1].LeaveTaken, new { width = "100" })</td>
<td>#Html.TextBoxFor(m => m.LeaveDetailsList[1].LeaveBalance, new { width = "100" })</td>
<td>#Html.TextBoxFor(m => m.LeaveDetailsList[1].LeaveTotal, new { width = "100" })</td>
</tr>
#*}*#
</table>
<br />
<table style="border:none">
<tr>
<td style="width:600px;text-align:left;border:none">
<input id="btnSave" type="submit" value="Save" style="width:100px" />
</td>
</tr>
</table>
}
</div>

The simplest way is to store all you need in session on the server and then to populate all you need from that session after submit.

Related

Paging is not working in MVC4

I am designing one page where I am displaying some details with paging. Page works fine except paging. When i click on second page nothing happens. All data cureently displayed will also go. Also when i hit on second page control wont go to my action method. This is my pager code.
#Html.PagedListPager(Model.logDetails, page => Url.Action("Index",
new { page, currentFilter = ViewBag.CurrentFilter, filterdateTime=ViewBag.filterdateTimepageSize, }))
Page #(Model.logDetails.PageCount < Model.logDetails.PageNumber ? 0 : Model.logDetails.PageNumber) of #Model.logDetails.PageCount
This is my action method code.
[HttpPost]
public ActionResult Index(int? clientId, DateTime? dateofAction,string typeofDocument,string employeeID,string citizenId,int? currentFilter,DateTime? filterdateTime,int? page)
{
DB_KYC3Entities db = new DB_KYC3Entities();
ViewBag.docTypes = new SelectList(db.tm_doc_type, "doc_typeid", "doctype_name");
if (clientId != null)
{
page = 1;
}
else
{
clientId = currentFilter;
}
if(dateofAction!=null)
{
page = 1;
}
else
{
dateofAction = filterdateTime;
}
ViewBag.CurrentFilter = clientId;
ViewBag.filterdateTime = dateofAction;
int pageSize = 8;
int pageNumber = (page ?? 1);
VerificationLogBAL obj = new VerificationLogBAL();
int docType = obj.GetDocDetails(typeofDocument);
List<logDetails> logDetails = obj.getlogDetails(clientId?? default(int), dateofAction?? DateTime.Now, docType, employeeID, citizenId);
IPagedList<logDetails> pagedLog = logDetails.ToPagedList(pageNumber, pageSize);
logDetailsEnumeration model = new logDetailsEnumeration();
ViewBag.checkData = logDetails.Count;
model = new logDetailsEnumeration()
{
logDetails= pagedLog
};
return View("Index",model);
}
This is my view code.
<div class="forms">
#using (Html.BeginForm("Index", "VerificationLog", FormMethod.Post))
{
#Html.AntiForgeryToken()
#Html.ValidationSummary(true)
<div class="message"></div>
<div class="loginUsernamePassword">
<i class="fa fa-user"></i>
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="dataTable tableHover">
<tr>
<th width="8%" scope="col">Client ID</th>
<th width="20%" scope="col">
<div class="form-box form-box-default">
#Html.TextBox("clientId", ViewBag.CurrentFilter as string, new { #id = "clientId", #placeholder = "Client ID", #class = "form-control", #maxlength = 20 })
</div>
</th>
<th width="10%" scope="col">Date Of Action</th>
<th width="20%" scope="col">
<div class="form-box form-box-default">
#Html.TextBox("dateofAction", ViewBag.filterdateTime as string, new { #id = "dateofAction", #placeholder = "Date Of Action", #class = "txtBox form-control calender validate[required]" })
</div>
</th>
<th width="15%" scope="col">Type Of Document</th>
<th width="17%" scope="col">
<div class="form-box form-box-default">
#*#Html.TextBox("typeofDocument", ViewBag.filterdateTime as string, new { #id = "typeofDocument", #placeholder = "Type Of Document", #class = "form-control", #maxlength = 20 })*#
#Html.DropDownList("docTypes",null,new {#id = "typeofDocument", #placeholder = "Type Of Document", #class = "form-control"})
</div>
</th>
</tr>
<tr>
<th width="15%" scope="col">Employee ID</th>
<th width="17%" scope="col">
<div class="form-box form-box-default">
#Html.TextBox("employeeID", ViewBag.filterdateTime as string, new { #id = "employeeID", #placeholder = "Employee ID", #class = "form-control", #maxlength = 20 })
</div>
</th>
<th width="15%" scope="col">Citizen ID</th>
<th width="17%" scope="col">
<div class="form-box form-box-default">
#Html.TextBox("citizenId", ViewBag.filterdateTime as string, new { #id = "citizenId", #placeholder = "Citizen ID", #class = "form-control", #maxlength = 20 })
</div>
</th>
<th width="10%" scope="col" colspan="2">
<input type="submit" value="Search" class="btn btn-primary btn-cons search" />
</tr>
</table>
</div>
}
</div>
#if (Model != null && Model.logDetails.Count != 0)
{
<br />
<h2>Verification Log</h2>
<br />
<div id="GridDetails">
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="dataTable tableHover">
<tr>
<th>Label</th>
<th>Value</th>
<th>UpdatedOn</th>
<th>UpdatedBy</th>
<th>UpdatedStatus</th>
<th>RejectComment</th>
</tr>
#foreach (var group in Model.logDetails)
{
<tr>
<td>#group.contentLabel</td>
<td>#group.contentValue</td>
<td>#group.updatedOn</td>
<td>#group.updatedBy</td>
<td>#group.updatedStatus</td>
<td>#group.rejectComment</td>
</tr>
}
</table>
[HttpGet]
public ActionResult Index()
{
DB_KYC3Entities db = new DB_KYC3Entities();
ViewBag.docTypes = new SelectList(db.tm_doc_type, "doc_typeid", "doctype_name");
return View();
}
When i click on second page control wont go to my index method also. Also i have 5 textboxes so do i need to preserve the all 5 text box values in viewbag? Can someone tell me? Thanks in advance
PagedListPager makes a GET call, not a POST, so you need to remove the [HttpPost] attribute from the Index() method. Associated with that, you need to change the form to also make a GET
#using (Html.BeginForm("Index", "VerificationLog", FormMethod.Get))
And yes, you need to preserve the all 5 text box values in viewbag (or better using a view model) and add those values in the pagers Url.Action() in the same way your are adding currentFilter and filterdateTime

No model binding with editor template

I have following view:
#model StockItemDetailModel
#using (Html.BeginForm("EditDetails", "StockItem"))
{
<div class="ItemDetails">
<table class="datagrid">
<tr>
<th colspan="3">#Model.StockItemPropertiesCaption</th>
</tr>
<tr>
<td class="label">#Model.StoreLabel</td>
<td class="value">#Html.DisplayFor(item => item.Store)</td>
<td></td>
</tr>
<tr>
<td class="label">#Model.BuildingLabel</td>
<td class="value">#Html.DevExpress().TextBoxFor(model => model.Building).GetHtml()</td>
<td class="validationError">#Html.ValidationMessageFor(model => model.Building)</td>
</tr>
...
<tr>
<td colspan="3">#Html.EditorFor(model => model.AmountModel, "Amounts")</td>
> </tr>
<tr>
<td colspan="3" class="validationError">#Html.ValidationMessageFor(model => model.AmountModel)</td>
</tr>
<tr />
</table>
</div>
<br />
<input type="submit" class="button" value="#Model.SaveButtonLabel" />
}
The partial View "Amounts" is as follows:
#model AmountModel
<table>
<tr>
<td class="label">#Model.AmountLabel</td>
<td class="value">
#Html.DevExpress().SpinEditFor(model => model.DenormalizedNetAmount,
settings =>
{
settings.Name = "DenormalizedNetAmount";
settings.Width = 153;
settings.Properties.DisplayFormatString = #"0.0,0";
settings.Number = 0;
}).GetHtml()
</td>
<td class="value">
#Html.DevExpress().ComboBoxFor(model => model.NetAmountUnit,
settings =>
{
settings.Name = "NetAmountUnit";
settings.Width = 60;
}).BindList(args => this.Model.AllUnits, args => this.Model.AllUnits).GetHtml()
</td>
</tr>
...
</table>
This is the AmountModel:
public class AmountModel
{
public decimal DenormalizedNetAmount { get; set; }
public string NetAmountUnit { get; set; }
...
public string AmountLabel
{
get { return i18n.StockItemDetailModel_AmountLabel; }
}
...
}
But the values of the input fields are not in the model in the Controller created by the model binder.
Why does the model binder not recognize the values in the editor template?
When I passed the FormCollection the values where correctly passed under the names "AmountModel.~"
public ActionResult EditDetails(FormCollection collection)
{
var netamount = collection["AmountModel.DenormalizedNetAmount"]; //correct value!
...
}
Do NOT specify the Name property when using the strong-typed (***For) helpers.
See the MVC Data Editors - Model Binding and Editing learning resource on the DevExpress forum.

How to pass a list of objects to a [HTTPPost]controller parameter, in ASP.Net MVC?

i have the next view:
#model IEnumerable<L5ERP.Model.BLL.BusinessObjects.MTR_MonthlyTransfer>
#using (Html.BeginForm("ExpenseMonthlyTransferProcessing", "BudgetTransfer", Model.ToList())){
<table class ="divTable">
<tr>
<th>Transferir</th>
<th>
Clave
</th>
<th>
Monto
</th>
</tr>
#foreach (var item in Model) {
<tr>
<td>
#Html.CheckBoxFor(x => item.MTR_Bool, new { #class = "checkMTR", #checked = "checked" })
</td>
<td>
#Html.TextBoxFor(x => item.MTR_Key, new {#class = "longInput" })
</td>
<td>
#String.Format("{0:F}", item.MTR_Amount)
</td>
</tr>
}
</table>
}
and my controller like this
[HttpPost]
public ActionResult ExpenseMonthlyTransferProcessing(List<MTR_MonthlyTransfer> lstMtr)
{ return View(lstMTR); }
But when i do the post my list is null, how can i send my list through the submit button ?
You should change the #model to an array (L5ERP.Model.BLL.BusinessObjects.MTR_MonthlyTransfer[]) or something else that implements IList<>:
#model L5ERP.Model.BLL.BusinessObjects.MTR_MonthlyTransfer[]
#for (var i = 0; i < Model.Length; i ++) {
<tr>
<td>
#Html.CheckBoxFor(x => Model[i].MTR_Bool, new { #class = "checkMTR", #checked = "checked" })
</td>
<td>
#Html.TextBoxFor(x => Model[i].MTR_Key, new {#class = "longInput" })
</td>
<td>
#String.Format("{0:F}", item.MTR_Amount)
</td>
</tr>
receive a FormCollection and parse the items in it manually
Use F12 to check the post in your navigator to see if it are sending the content you expected.

Why the value is changed after clicking the submit button?

I make one action method for 2 activities (new input and edit), and there is also only one
view to handle those activities.
But I don't understand no matter what activity happen, the action method always think it is a new input.
I learned that it because of the ID is always 0, but the problem is, when doing the edit, when in the view the ID is correct as the ID of the data, but when I click the submit button, the action method just see the 0 value of ID.
Here is the action method I used:
[HttpPost]
public ActionResult AddAssignment(SateliteSchedule SatSched)
{
var txt = "";
if (ModelState.IsValid)
{
if (SatSched.ID == 0)
{
db.SateliteSchedules.Add(SatSched);
txt = "{0} has been added!";
}
else
{
db.Entry(SatSched).State = EntityState.Modified;
txt = "{0} has been modified!";
}
db.SaveChanges();
Utility utl = new Utility();
TempData["message"] = string.Format(txt, utl.GetSateliteName(SatSched.SateliteID));
return RedirectToAction("FormAssignment");
}
else
{
ViewBag.Message = "ModelState is not Valid!";
return View("ErrorView");
}
}
And here is the view:
#using (Html.BeginForm("AddAssignment", "admin", FormMethod.Post))
{
#Html.ValidationSummary(true)
<table>
<tr>
<td>#Html.LabelFor(m => m.Tanggal)
</td>
<td>
#Html.EditorFor(m => m.Tanggal)
#Html.ValidationMessageFor(m => m.Tanggal)
</td>
</tr>
<tr>
<td>#Html.LabelFor(m => m.SateliteID)</td>
<td>
#Html.DropDownList("SateliteID", (IEnumerable<SelectListItem>)ViewBag.SatList, "--- Satelite ---")
#Html.ValidationMessageFor(m => m.SateliteID)
</td>
</tr>
<tr>
<td>#Html.LabelFor(m => m.WMOnDuty)</td>
<td>
#Html.DropDownList("WMOnDuty", (IEnumerable<SelectListItem>)ViewBag.WMList, "--- Worship Manager ---")
#Html.ValidationMessageFor(m => m.WMOnDuty)
</td>
</tr>
<tr>
<td>#Html.LabelFor(m => m.SMOnDuty)</td>
<td>#Html.EditorFor(m => m.SMOnDuty)</td>
</tr>
<tr>
<td>#Html.LabelFor(m => m.WLOnDuty)</td>
<td>#Html.EditorFor(m => m.WLOnDuty)</td>
</tr>
<tr>
<td>#Html.LabelFor(m => m.MLOnDuty)</td>
<td>#Html.EditorFor(m => m.MLOnDuty)</td>
</tr>
<tr>
<td>#Html.LabelFor(m => m.SoundMan)</td>
<td>#Html.EditorFor(m => m.SoundMan)</td>
</tr>
<tr>
<td valign=top>#Html.LabelFor(m => m.Note)</td>
<td>#Html.TextAreaFor(model => model.Note, new { #class = "memo-text" })</td>
</tr>
</table>
<div>
<input type="submit" value="Save" />
#Html.ActionLink("Kembali", "FormAssignment")
</div>
}
What should I check to fix this?
You have to have the Id as a hidden, so when you go in the method the model will have the id asigned to it (does it make sense?). try placing this in your form
#Html.HiddenFor(m => m.ID)

Model Binding not working with mvc1

We have very large object called FoodFormViewModel. We go to add page like
FoodFormViewModel foodFormViewModel = new FoodFormViewModel();
return View("Edit", foodFormViewModel);
But when we come to post method like
[AcceptVerbs(HttpVerbs.Post)]
[ValidateInput(false)]
public ActionResult Edit(FoodFormViewModel objViewModel)
{
SaveProcess(objViewModel);
return View(objViewModel);
}
Our objViewModel properties are all blank. Our FoodFormViewModel definition is
#region Properties
public MealPlannerDataManager MPManager { get; set; }
public Food Food { get; set; }
public SelectList FoodGroupLevel1 { get; set; }
public SelectList FoodGroupLevel2 { get; set; }
public SelectList FoodGroupLevel3 { get; set; }
public SelectList FoodType { get; set; }
public SelectList Company { get; set; }
public SelectList Brand { get; set; }
public SelectList NutritionSource { get; set; }
public SelectList DataSource { get; set; }
public SelectList PlannerSource { get; set; }
public SelectList PublishMonth { get; set; }
public SelectList PublishDay { get; set; }
public SelectList PublishYear { get; set; }
public SelectList TagTypes { get; set; }
public List<CheckBoxInfo> MealTime { get; set; }
public List<CheckBoxInfo> Condition { get; set; }
public List<CheckBoxInfo> Allergens { get; set; }
public List<CheckBoxInfo> Occasions { get; set; }
public List<CheckBoxInfo> Others { get; set; }
public List<CheckBoxInfo> SpecialDiet { get; set; }
public List<CheckBoxInfo> Course { get; set; }
public List<CheckBoxInfo> PrepMethod { get; set; }
public List<CheckBoxInfo> Season { get; set; }
public List<CheckBoxInfo> SkillLevel { get; set; }
public List<CheckBoxInfo> Cuisine { get; set; }
public List<CheckBoxInfo> MealPlan { get; set; }
public List<CheckBoxInfo> Products { get; set; }
public List<CheckBoxInfo> AgeGroup { get; set; }
public FoodNutritionInfo NutrInfo { get; set; }
public FoodNutritionInfo AltNutrInfo { get; set; }
Tag dummyTag = new Tag();
TagType dummyTagType = new TagType();
#endregion Properties
WE couldn't figure out the issue. Any help is highly appreciated.
We are using MVC1 with VS 2008
My view contains 3-4 partial views, i am posting one of the partial view here
<%# Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MealPlannerAdmin.Models.ViewModel.FoodFormViewModel>" %>
<%# Import Namespace="MealPlannerAdmin.Models.Objects.HTMLHelpers" %>
<%# Import Namespace="MealPlanner.BusinessObjects.Model" %>
<div id="ValidationSummary" style="position: absolute; margin: 110px 0px 0px 620px;
width: 350px; height: 359px; overflow: auto; border: 0px">
<%=Html.ValidationSummary("Please review all tabs for following errors") %>
</div>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td colspan="2">
<div id="foobar" style="color: Red;">
<%=ViewData["CloningMessage"]%></div>
</td>
</tr>
<tr>
<td colspan="2" class="comHead">
<strong>Food Basic Information</strong>
</td>
</tr>
<tr>
<td colspan="2">
<div id="divCloningMessage" class="errMsg">
</div>
</td>
</tr>
<tr>
<td colspan="2">
<div id="divBtnCloneThisFood" style="display: none;">
<input type="button" value="Clone this Food" id="btnCloneThisFood" name="btnCloneThisFood" />
</div>
</td>
</tr>
<tr>
<td width="200" valign="top">
<span id="spanOriginalCreatorLabel"></span>
</td>
<td>
<span id="spanOriginalCreator"></span>
</td>
</tr>
<tr>
<td width="200" valign="top">
<span id="spanClonedByLabel"></span>
</td>
<td>
<span id="spanClonedBy"></span>
</td>
</tr>
<tr>
<td width="200" valign="top">
<label for="lblFoodID">
Food ID:
</label>
</td>
<td>
<span id="spanFoodID" name="spanFoodID">
<%=Model.Food.FoodID%></span>
</td>
</tr>
<tr>
<td valign="top">
<label for="ddlFoodGroupLevel1">
Food Group Level 1: *</label>
</td>
<td>
<%=Html.DropDownList("ddlFoodGroupLevel1", Model.FoodGroupLevel1, new { #class = "dropdown"})%> <%=Html.ValidationMessage("FoodGroupLevel1", "*")%>
</td>
</tr>
<tr>
<td valign="top">
<label for="ddlFoodGroupLevel2">
Food Group Level 2 :
</label>
</td>
<td>
<%=Html.DropDownList("ddlFoodGroupLevel2", Model.FoodGroupLevel2, new { #class = "dropdown" })%> <%=Html.ValidationMessage("FoodGroupLevel2", "*")%>
</td>
</tr>
<tr>
<td valign="top">
<label for="ddlFoodGroupLevel3">
Food Group Level 3:
</label>
</td>
<td>
<%=Html.DropDownList("ddlFoodGroupLevel3", Model.FoodGroupLevel3, new { #class = "dropdown" })%>
</td>
</tr>
<tr>
<td valign="top">
<label for="Food.FoodName">
Food Name: *</label>
</td>
<td>
<%=Html.TextBox("FoodName", Model.Food.FoodName, new { #maxlength = "250" })%> <%=Html.ValidationMessage("FoodName", "*")%>
</td>
</tr>
<tr>
<td valign="top">
<label for="FoodDisplayName">
Food Display Name: *</label>
</td>
<td>
<%=Html.TextBox("FoodDisplayName", Model.Food.FoodDisplayName, new { #maxlength = "250" })%> <%=Html.ValidationMessage("FoodDisplayName", "*")%>
</td>
</tr>
<tr>
<td valign="top">
<label for="ddlFoodType">
Food Type: *</label>
</td>
<td>
<%=Html.DropDownList("ddlFoodType", Model.FoodType, new { #class = "dropdown" })%> <%=Html.ValidationMessage("FoodType", "*")%>
</td>
</tr>
<tr id="rowCompany">
<td valign="top">
<label for="ddlCompany">
<span id="spanCompany" name="spanCompany"></span>
</label>
</td>
<td>
<%=Html.DropDownList("ddlCompany", Model.Company, new { #class = "dropdown" })%> <%=Html.ValidationMessage("Company", "*")%>
</td>
</tr>
<tr id="rowAddCompany">
<td>
</td>
<td>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2" valign="top" class="subHead">
<label for="txtAddCompany">
<span id="spanAddCompany" name="spanAddCompany"></span>
</label>
</td>
</tr>
<tr>
<td>
<%=Html.TextBox("txtAddCompany", string.Empty, new { #id = "txtAddCompany", #maxlength = 100, #boundButton = "btnNewCompany", #catId = Convert.ToInt16(EntityConstants.TagType.Company), #catName = EntityConstants.TagType.Company, #updateEle = "divAgeGroup", #uiUpdateType = "drop-down-list" })%>
<div id="divAddCompanyError" boundbutton="btnNewCompany" class="errHidden">
</div>
<div id="<%=EntityConstants.TagType.Company %>Message" style="display: none; color: Red;">
</div>
</td>
<td>
</td>
</tr>
<tr>
<td>
<%=Html.TextArea("txtAddCompanyDesc", string.Empty, 5, 42, new { #id = "txtAddCompanyDesc", #class = "text-area-classic w374px", #boundButton = "btnNewCompany" })%>
</td>
<td valign="bottom">
<input type="button" value="Add" id="btnNewCompany" />
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td valign="top">
<label for="cblMealTime">
Meal Time:</label>
</td>
<td>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<%=Html.CheckBoxGrid("cblMealTime", Model.MealTime, 4) %>
</td>
<td>
<%=Html.ValidationMessage("Meal", "*")%>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td valign="top">
<label for="ddlNutritionSource">
Nutrition Source: *</label>
</td>
<td>
<%=Html.DropDownList("ddlNutritionSource", Model.NutritionSource, new { #class = "dropdown" })%> <%=Html.ValidationMessage("NutritionSource", "*")%>
</td>
</tr>
<tr>
<td valign="top">
<label for="ddlDataSource">
Data Source: *</label>
</td>
<td>
<%=Html.DropDownList("ddlDataSource", Model.DataSource, new { #class = "dropdown" })%> <%=Html.ValidationMessage("DataSource", "*")%>
</td>
</tr>
<tr>
<td valign="top">
<label for="Display">
Display: *</label>
</td>
<td>
<%=Html.RadioButton("Display", true, Model.Food.Display, new { #id = "DisplayTrue" })%><label>Yes</label>
<%=Html.RadioButton("Display", false, !(Model.Food.Display), new { #id = "DisplayFalse" }) %><label>No</label>
</td>
</tr>
<tr>
<td valign="top">
<label for="Issue">
Issue: *</label>
</td>
<td>
<%=Html.RadioButton("Issue", true, Model.Food.Issue, new {#id="IssueTrue", #onclick= "disableIssueText()"})%><label>Yes</label>
<%=Html.RadioButton("Issue", false, !(Model.Food.Issue), new {#id="IssueFalse", #onclick = "disableIssueText()" })%><label>No</label>
</td>
</tr>
<tr>
<td valign="top">
<label for="IssueDescription">
Describe Issue:
</label>
</td>
<td>
<%=Html.TextArea("IssueDescription", Model.Food.IssueDescription, 4, 75, new { #maxlength = "50", #class = "w500px" })%>
</td>
</tr>
<tr>
<td valign="top">
<label for="FoodDescription">
Description:</label>
</td>
<td>
<%=Html.TextArea("FoodDescription", Model.Food.FoodDescription, 5, 40, new { #maxlength = "50" })%> <%=Html.ValidationMessage("FoodDescription", "*")%>
</td>
</tr>
<tr>
<td valign="top">
<label for="Tags">
Tags:</label>
</td>
<td>
<%=Html.TextArea("Tags", Model.Food.Tags, 5, 40, new { #maxlength = "50" })%> <%=Html.ValidationMessage("Tags", "*")%>
</td>
</tr>
<tr>
<td valign="top">
<label for="Image">
Image:</label>
</td>
<td>
<table>
<tr>
<td>
<%=Html.Image("Img200x200", Model.Food.Img200x200, "Food Image", new { #width = "200", #height = "200" })%>
</td>
</tr>
<tr>
<td>
<div id="browseFile">
<input name="Image" id="Image" type="file" size="45" onchange="document.getElementById('inputTxtFake').value = this.value;"
class="inputImage" />
<!-- fake input to display the path of the selected file : start -->
<input name="inputTxtFake" type="text" id="inputTxtFake" />
<!-- fake input to display the path of the selected file : end -->
</div>
<input id="ClonedFromFoodID" name="ClonedFromFoodID" type="hidden" value="<%=Model.Food.ClonedFromFoodID %>" />
<input id="IsUserFood" name="IsUserFood" type="hidden" value="<%=Model.Food.IsUserFood %>" />
<input id="Img200x200" name="Img200x200" type="hidden" value="<%=Model.Food.Img200x200 %>" />
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
<script language="javascript" type="text/javascript">
$(document).ready(function() {
var isUserFood = '<%=Model.Food.IsUserFood %>';
var hasClones = '<%=Model.Food.HasClones %>';
var isClone = '<%=Model.Food.IsClone %>';
var canClone = window.location.toString().toLowerCase().indexOf("/edit") > -1;
var gettingCloned = window.location.toString().toLowerCase().indexOf("/clone") > -1
if (hasClones.toLowerCase() == 'true') {
$("#divCloningMessage").html("This food has already been cloned.");
canClone = 'false';
}
originalCreator = '<%=Model.Food.OriginalCreator%>';
clonedFromFoodID = '<%=Model.Food.ClonedFromFoodID%>';
$("#spanOriginalCreatorLabel").html("Original Creator:");
$("#spanOriginalCreator").html(originalCreator);
if (isClone.toLowerCase() == 'true') {
var originalCreator;
$("#spanClonedByLabel").html("Cloned By:");
$("#spanClonedBy").html("WFM Nutritionist");
$("#divCloningMessage").html("This food is cloned from food with id " + clonedFromFoodID + ".");
canClone = 'false';
}
if (canClone == true) {
utility.ui.makeYUIButton("btnCloneThisFood");
$("#btnCloneThisFood-button").click(function() {
var cloneFoodId = '<%=Model.Food.FoodID %>';
var clonedFoodUrl = '<%=Url.Content("~/") %>foods/clone/' + cloneFoodId;
window.location = clonedFoodUrl;
});
$("#divBtnCloneThisFood").show();
}
var clonedFromFoodID = $("#ClonedFromFoodID").val();
if (gettingCloned) {
$("#spanFoodID").html("0");
}
utility.ui.makeYUIButton("btnNewCompany");
checkForBasicFood();
$("#ddlFoodType").change(function() {
checkForBasicFood();
});
$("#btnNewCompany").click(function() {
var btnID, txtNameId, txtDescId, catId, catName, eleToUpdateId, uiUpdateType;
btnID = "btnNewCompany";
txtNameId = $("input[boundbutton='" + btnID + "']").attr('id');
txtDescId = $("textarea[boundbutton='" + btnID + "']").attr('id');
catId = $("input[boundbutton='" + btnID + "']").attr('catId');
eleToUpdateId = $("input[boundbutton='" + btnID + "']").attr('updateEle');
catName = $("input[boundbutton='" + btnID + "']").attr('catName');
uiUpdate = $("input[boundbutton='" + btnID + "']").attr('uiUpdateType');
if ($("#" + txtNameId).val() == "")
$("div[boundButton='" + btnID + "']").fadeIn().fadeOut(10000);
else {
var subCategory = {
categoryId: catId,
parentCategoryId: $("#ddlFoodType").val(),
categoryLevel: 2,
categoryName: $("#" + txtNameId).val(),
categoryDescription: $("#" + txtDescId).val(),
categoryIconPath: "",
sortOrder: 0
};
// Initializing food helper
foodHelper.init('<%= Url.Content("~/") %>');
foodHelper.addSubCategory(subCategory, {
updateElementId: eleToUpdateId,
updateDropdownID: "ddlCompany",
categoryName: catName,
messageDivId: catName + "Message",
catNameTxtBoxId: txtNameId,
catDescTxtBoxId: txtDescId,
uiUpdateType: uiUpdate
});
}
});
});
function checkForBasicFood() {
if ($("#ddlFoodType").val() == 1444 || $("#ddlFoodType").val() == -1) { // Bad: hard coding value
$("#rowCompany").hide();
$("#rowAddCompany").hide();
}
else {
var selectedFoodType = $("#ddlFoodType").val();
if (selectedFoodType == 688) {
$("#spanCompany").html("Restaurant Brand:");
$("#spanAddCompany").html("Add a New Restaurant Brand:");
$("#divAddCompanyError").html("Please enter name for Restaurant Brand.");
}
else if (selectedFoodType == 689) {
$("#spanCompany").html("Store Brand:");
$("#spanAddCompany").html("Add a New Store Brand:");
$("#divAddCompanyError").html("Please enter name for Store Brand.");
}
$("#rowCompany").show();
$("#rowAddCompany").show();
}
}
</script>
Personally, I think it is very odd to have properties of type SelectList and List<CheckBoxInfo> in your view model class. Most viewmodels should contain properties of very basic types, like string and int. The way you have, makes it very hard to debug & identify your problems but I would go and say that most likely the default model binder doesn't know how to bind values from HTML controls to your viewmodel props.
I would advise looking into building a custom modelbinder or rewriting the view model class. Or rewriting the app as a whole (but I guess that's not an option).
HTH
Certain property name don't match with actual names............need to modify

Resources