Reputation: 17366
HI i am facing one problem in development.
I just want to retain my form data after submitting my form with httppost method in MVC3
I don't want to redirect anywhere after post, on the same form i want my submitted values back in all fields
Any sugestions?
I am doing processing in following method
[AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
public ActionResult PostJobAction(FormCollection PostJobForm, HttpPostedFileBase uploadfile, JobsDetailModel objLocationModel)
{
bool blnSavedResume = false;
// JobsBusinessComponent objJobsBusinessComponent = new JobsBusinessComponent();
JobsClient objJobsBusinessComponent = new JobsClient();
UserModel objUserModel = null;
// byte[] bytArrayResume = null;
string strlogoImageName = string.Empty;
if (uploadfile != null) //if (uploadfile != null && uploadfile.ContentLength > 1024)
{
string UserFolderName = ConfigurationManager.AppSettings["LogoPath"].ToString() + objLocationModel.InstituteName.Trim();
if (!Directory.Exists(UserFolderName))
{
Directory.CreateDirectory(UserFolderName);
}
strlogoImageName = Guid.NewGuid().ToString() + "_" + uploadfile.FileName;
blnSavedResume = Utility.ResizeStream(Convert.ToInt16(ConfigurationManager.AppSettings["LogoSize"]), uploadfile.InputStream, UserFolderName + @"\" + strlogoImageName);
//using (MemoryStream ms = new MemoryStream())
//{
// var filePath = System.IO.Path.GetFileName(uploadfile.FileName);
// Image image = Utility.ScaleBySize(Image.FromFile(uploadfile.FileName, true), 200);
// uploadfile.InputStream.CopyTo(ms);
// bytArrayResume = ms.GetBuffer();
//}
//// byte[] bytArrayResume = uploadfile.InputStream.
//blnSavedResume = objJobsBusinessComponent.SaveResumeOnDisk(UserFolderName, uploadfile.FileName, bytArrayResume);
}
if (blnSavedResume)
{
objUserModel = Utility.GetGuestUserData(); ;
//objLocationModel.StateID = objUserModel.StateID;
objLocationModel.CountryID = objUserModel.CountryID;
objLocationModel.LogoFileName = strlogoImageName;
objJobsBusinessComponent.PostJob(objLocationModel, 4);
}
TempData["Message"] = "Success";
//return RedirectToAction("Index");
if (ModelState.IsValid)
{
return View(objLocationModel);
}
else
{
// Dropdown selected values needs to be repopulated here , if there error in the model.
return View(objLocationModel);
}
// return View("~/Views/Employer/PostJob.cshtml");
}
This is the RAZOR Code. Suggest me if i am doing wrong, because i am totally new to MVC.
@using (Html.BeginForm("PostJobAction", "PostJob", FormMethod.Post, new { enctype = "multipart/form-data", id = "PostJobForm", objPostJobModel = Model }))
{
<div class="post_job" align="center" style="margin-left: 1px">
<div id="tabs_container">
<div class="my_profile_header">
<img src="images/high_school.png" width="21" height="20" hspace="5" vspace="3" align="left" /><strong>Post
Job</strong>
<label style="float: right; color: Red; font-family: Calibri; font-style: italic;
margin-top: 10px">
Fields marked with '*' are mandatory</label>
</div>
<div class="my_profile" id="InstituteDetail" style="display: block;">
<div class="header_title_form">
<img src="images/photo.png" width="24" height="24" hspace="5" vspace="2" align="left" /><div
align="left" style="vertical-align: middle; margin-left: 40px; margin-top: 3px;
font-weight: normal;">
Institute Detail</div>
</div>
</div>
<div class="my_profile_container" align="center" style="background: none">
<div class="clear">
</div>
<div class="emolyer_box">
<div align="center" class="mailbox">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="30" align="left">
@Html.Label("Institute Type:")<label style="color: Red">*</label>
</td>
<td width="319" height="30" align="left">
@Html.DropDownListFor(x => x.InstituteType, (SelectList)ViewBag.InstituteType, "--Please Select Institute Type--", new { @class = "select", id = "ddlInstituteType", name = "InstituteType" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left" valign="middle">
@Html.Label("Institute Category:")<label style="color: Red">*</label>
</td>
<td width="319" height="30" align="left" valign="middle">
<select name="InstituteCategory" id="ddlInstituteCategory" class="select" disabled="disabled">
</select>
<img id="LoadingImage" style="width: 30px; height: 30px; vertical-align: middle;
visibility: hidden" src="../../Content/images/LoadingImage.gif" alt="Loading.." />
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left">
@Html.Label("Institute Name:")<label style="color: Red">*</label>
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextBoxFor(x => x.InstituteName, new { id = "txtInstituteName", Name = "InstituteName", @class = "input" })
<a style="text-decoration: none; color: Gray; cursor: default;" title="Subscription required for this feature">
<u>Add More</u></a>
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left">
@Html.Label("Zip Code:")
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextBoxFor(x => x.InstituteName, new { id = "txtZipCode", Name = "ZipCode", @class = "input" })
</td>
</tr>
</table>
</div>
</div>
<div class="emolyer_box">
<div align="left" class="mailbox">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="30" align="left">
@Html.Label("Institute State:")<label style="color: Red">*</label>
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.DropDownListFor(x => x.StateID, (SelectList)ViewBag.StateList, "---Please Select State---", new { @class = "select", ID = "ddlState", Name = "StateID" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left" valign="middle">
@Html.Label("Institute City:")<label style="color: Red">*</label>
</td>
<td width="319" height="30" align="left" valign="middle">
<select name="CityID" id="ddlCity" class="select" runat="server">
</select>
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left">
@Html.Label("Institute Address:")
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextAreaFor(x => x.InstituteAddress, new { @class = "input", id = "txtInstituteAddress", style = "height:60px" })
</td>
</tr>
</table>
</div>
</div>
<div class="clear">
</div>
</div>
<!-- End of Institute Div -->
<div class="my_profile" id="JobDetail" style="display: block">
<div class="header_title_form">
<img src="images/photo.png" width="24" height="24" hspace="5" vspace="2" align="left" /><div
align="left" style="vertical-align: middle; margin-left: 40px; margin-top: 3px;
font-weight: normal">
Job Detail</div>
</div>
</div>
<div class="my_profile_container" align="center">
<div class="clear">
</div>
<div class="emolyer_box">
<div align="center" class="mailbox">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="30" align="left">
@Html.Label("Job Title:")<label style="color: Red">*</label>
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextBoxFor(x => x.JobTitle, new { id = "txtJobTitle", Name = "JobTitle", @class = "input" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left" valign="middle">
@Html.Label("Role:")
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.DropDownListFor(x => x.RoleID, (SelectList)ViewBag.RoleList, "---Please Select Role---", new { @class = "select", ID = "ddlRole" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left">
@Html.Label("Subject:")
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.DropDownListFor(x => x.SubjectID, (SelectList)ViewBag.SubjectList, "---Please Select Subject---", new { @class = "select", ID = "ddlSubject" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left">
@Html.Label("Qualification:")
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.DropDownListFor(x => x.QualificationID, (SelectList)ViewBag.QualificationList, "---Please Select Qualification---", new { @class = "select", ID = "ddlQualification" })
</td>
</tr>
</table>
</div>
</div>
<div class="emolyer_box">
<div align="left" class="mailbox">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="30" align="left">
@Html.Label("Job Type:")
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.DropDownListFor(x => x.JobType, (SelectList)ViewBag.JobTypeList, "---Please Select Job Type---", new { @class = "select", ID = "ddlJobType" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left" valign="middle">
@Html.Label("Experience:")
</td>
<td width="319" height="30" align="left" valign="middle">
<div class="clear">
</div>
<div style="text-align: left">
<select name="MinExperience" id="MinExperienceDropDown" style="width: 32%" class="select">
<option value="">--Minimum--</option>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<select name="MaxExperience" id="MaxExperienceDropDown" style="width: 32%; float: right;
margin-right: 82px" class="select">
<option value="">--Maximum--</option>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</div>
<div class="clear">
</div>
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left">
@Html.Label("Salary:")
</td>
<td width="319" height="30" align="left" valign="middle">
<div class="clear">
</div>
<div style="text-align: left">
<select name="MinSalary" id="MinSalaryDropDown" style="width: 32%" class="select">
<option value="">--Minimum--</option>
<option value="0">0</option>
<option value="1000">1000</option>
<option value="2000">2000</option>
<option value="3000">3000</option>
<option value="4000">4000</option>
<option value="5000">50000</option>
</select>
<select name="MaxSalary" id="MaxSalaryDropDown" style="width: 32%; float: right;
margin-right: 82px" class="select">
<option value="">--Maximum--</option>
<option value="0">0</option>
<option value="1000">1000</option>
<option value="2000">2000</option>
<option value="3000">3000</option>
<option value="4000">4000</option>
<option value="5000">5000</option>
</select>
</div>
<div class="clear">
</div>
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left">
@Html.Label("No Of Position:")
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextBoxFor(x => x.NoOfPosition, new { id = "txtNoOfPosition", Name = "NoOfPosition", @class = "input" })
</td>
</tr>
</table>
</div>
</div>
<div class="clear">
</div>
</div>
<!-- End of Job Detail Div -->
<div class="my_profile" id="JobDescription" style="display: block">
<div class="header_title_form">
<img src="images/photo.png" width="24" height="24" hspace="5" vspace="2" align="left" /><div
align="left" style="vertical-align: middle; margin-left: 40px; margin-top: 3px;
font-weight: normal">
Job Description<label style="color: Red">*</label></div>
</div>
</div>
<div class="my_profile_container" align="center">
<div class="clear">
</div>
<div class="emolyer_box">
<div align="center" class="mailbox">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="30" align="left" id="HtmlEditor">
@Html.TextAreaFor(x => x.JobDescriptionText, new { name = "inputHtmlEditor", id = "JobDescriptionText", rows = "5", })
@*<textarea id="inputHtmlEditor" name="inputHtmlEditor" rows="5"></textarea>*@
</td>
</tr>
</table>
</div>
</div>
<div class="clear">
</div>
</div>
<div class="my_profile" id="ContactInfo" style="display: block">
<div class="header_title_form">
<img src="images/photo.png" width="24" height="24" hspace="5" vspace="2" align="left" /><div
align="left" style="vertical-align: middle; margin-left: 40px; margin-top: 3px;
font-weight: normal">
Contact Info</div>
</div>
</div>
<div class="my_profile_container" align="center">
<div class="clear">
</div>
<div class="emolyer_box">
<div align="center" class="mailbox">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="30" align="left">
@Html.Label("Contact Person Name:")<label style="color: Red">*</label>
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextBoxFor(x => x.ContactPersonName, new { id = "txtContPersonName", Name = "ContactPersonName", @class = "input" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left" valign="middle">
@Html.Label("Phone No:")<label style="color: Red">*</label>
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextBoxFor(x => x.InstitutePhoneNo, new { id = "txtInstitutePhoneNo", Name = "InstitutePhoneNo", @class = "input" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left">
@Html.Label("Logo On Home Page:")
</td>
<td width="319" height="30" align="left" valign="middle">
<input type="checkbox" disabled="disabled" title="Subscription required for this feature" />
<a style="text-decoration: none; color: Gray; cursor: default;" title="Subscription required for this feature">
<u>Add/Edit Details</u></a>
</td>
</tr>
</table>
</div>
</div>
<div class="emolyer_box">
<div align="left" class="mailbox">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="30" align="left">
@Html.Label("E-Mail:")<label style="color: Red">*</label>
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextBoxFor(x => x.ContactPersonEmailID, new { id = "txtContactPersonEmailID", Name = "ContactPersonEmailID", @class = "input" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left" valign="middle">
@Html.Label("Web Site URL:")
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextBoxFor(x => x.InstituteWebSite, new { id = "txtInstituteWebSite", Name = "InstituteWebSite", @class = "input" })
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td height="30" align="left">
@Html.Label("Upload Logo Image:")
</td>
<td width="319" height="30" align="left" valign="middle">
@Html.TextBox("uploadfile", "", new { @class = "input", id = "fileupload", type = "file" })
</td>
</tr>
</table>
</div>
</div>
<div class="clear">
</div>
</div>
<input type="text" value="@TempData["Message"]" />
</div>
<!-- End of contact info -->
<input type="button" class="green_btn" value="Save" disabled="disabled" style="cursor: default"
title="Subscription required for this feature" />
<input type="submit" class="blue_btn" value="Post" />
<input type="button" class="blue_btn" value="Cancel" />
<input type="text" value="@TempData["Message"]" />
@Html.Hidden("HiddenField", TempData["Message"])
</div>
}
Upvotes: 1
Views: 9816
Reputation: 17108
Okay so the issue is that you have a few DropDownList on your page that come from ViewBags but those ViewBags are not recreated in PostJobAction
. Let me just reiterate what Hari Gillala metioned that it's not great to use ViewBag, at least not that way.
Let's solve your issue first, any controls that are bound to your model will retain their values when you return your View with the model like this:
[AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
public ActionResult PostJobAction(FormCollection PostJobForm, HttpPostedFileBase uploadfile, JobsDetailModel objLocationModel)
{
return View(objLocationModel);
}
The next thing to do is to have the values in your dropdowns so you need to recreate your ViewBags:
[AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
public ActionResult PostJobAction(FormCollection PostJobForm, HttpPostedFileBase uploadfile, JobsDetailModel objLocationModel)
{
// do this code after you are done doing your stuff
// you always need to do this since you want to have the same form whether there is an error or your operation is a success
ViewBag.JobTypeList = create_this_list();
ViewBag.InstituteType = = create_this_list_also();
return View(objLocationModel);
}
But there is a better way of doing what you're doing now and that is to create a model that contains a few properties including your lists:
// The Model
public class JobActionFormModel {
public JobsDetailModel InputModel {get;set;}
public IEnumerable<JobType> JobTypes {get;set;}
public IEnumerable<InstituteType> InstituteTypes {get;set;}
}
// The way you build it
[AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
public ActionResult PostJobAction(FormCollection PostJobForm, HttpPostedFileBase uploadfile, JobsDetailModel objLocationModel)
{
var model = new JobActionFormModel {
InputModel = objLocationModel,
JobTypes = create_this_list(),
InstituteTypes = create_this_list_also(),
}
return View(objLocationModel);
}
// The way you consume it on your view
<td width="319" height="30" align="left">
@Html.DropDownListFor(x => x.InstituteType, new SelectList(Model.InstituteTypes, "Id", "Value", Model.InstituteType, new { @class="select" })
</td>
// same goes for all your lists
Upvotes: 1
Reputation: 11916
[HttpPost]
public ActionResult PostJobAction(FormCollection PostJobForm, HttpPostedFileBase uploadfile, JobsDetailModel objLocationModel)
{
if(ModelState.IsValid)
{
return View(objLocationModel);
}
else
{
// Dropdown selected values needs to be repopulated here , if there error in the model.
return View(objLocationModel);
}
}
Upvotes: 0
Reputation: 12904
Just return the view with the populated model;
return View(objLocationModel);
Upvotes: 2