Passing Model in ViewModel to controller get null (Edit Form) - asp.net-mvc
This edit form was already success, then i want to add add comment to this form, to do this i'm following this article
http://www.arrangeactassert.com/when-to-use-html-renderpartial-and-html-renderaction-in-asp-net-mvc-razor-views/
i create the viewmodel named CaseInternalEditViewModel
public class CaseInternalEditViewModel
{
public CaseInternalEditViewModel()
{
caseComment = new List<CaseComment>();
}
public String caseIDComment { get; set; }
public CaseInternal caseInternal { get; set; }
public List<CaseComment> caseComment { get; set; }
}
and change model in View :
#model myCHMTest.Models.CaseInternalEditViewModel
#{
ViewBag.Title = "Edit";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Edit</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>
<div class="container">
<fieldset>
#using (Html.BeginForm())
{
#Html.ValidationSummary(true)
<legend>CaseInternal</legend>
<div class="container">
#Html.HiddenFor(model => model.caseIDComment)
#Html.HiddenFor(model => model.caseInternal.ID)
#Html.HiddenFor(model => model.caseInternal.CaseID)
#Html.HiddenFor(model => model.caseInternal.StatusID)
#* #Html.HiddenFor(model => model.caseInternal.CreatedNIK)*#
#Html.HiddenFor(model => model.caseInternal.CreatedBy)
#Html.HiddenFor(model => model.caseInternal.CreatedDt)
#Html.HiddenFor(model => model.caseInternal.SLA)
#Html.HiddenFor(model => model.caseInternal.SLAFlag)
#Html.HiddenFor(model => model.caseInternal.DatCreated)
#Html.HiddenFor(model => model.caseInternal.DayResolved)
#Html.HiddenFor(model => model.caseInternal.CategoryID)
<div class="sixteen columns">
<div class="fbbluebox">
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.CaseID)
#Html.DisplayFor(model => model.caseInternal.CaseID)
#Html.ValidationMessageFor(model => model.caseInternal.CaseID)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.Title)
</div>
<div class="editor-field">
#Html.EditorFor(model => model.caseInternal.Title)
#Html.ValidationMessageFor(model => model.caseInternal.Title)
</div>
</div>
<hr />
</div>
<div class="one-third column">
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.BranchID)
</div>
<div class="editor-field">
#Html.DropDownList("BranchID")
#Html.ValidationMessageFor(model => model.caseInternal.BranchID)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.ProjectID, "InternalProject")
</div>
<div class="editor-field">
#Html.DropDownList("ProjectID", null, new { #onchange = "javascript:cascadingdropdown();" })
#Html.ValidationMessageFor(model => model.caseInternal.ProjectID)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.SubProjectID, "InternalSubProject")
</div>
<div class="editor-field">
#Html.DropDownList("SubProjectID", String.Empty)
#*#Html.DropDownListFor(model => model.SubProjectID, new SelectList(Enumerable.Empty<SelectListItem>()))*#
#Html.ValidationMessageFor(model => model.caseInternal.SubProjectID)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.PengaduanID, "InternalPPengaduan")
</div>
<div class="editor-field">
#Html.DropDownList("PengaduanID", String.Empty)
#Html.ValidationMessageFor(model => model.caseInternal.PengaduanID)
</div>
</div>
<div class="one-third column">
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.CreatedNIK)
</div>
<div class="editor-field">
#* #Html.TextBoxFor(model => model.caseInternal.CreatedNIK, new { disabled = "disabled" })
#Html.ValidationMessageFor(model => model.caseInternal.CreatedNIK)*#
<input type="text" name="InitialNIK" value="#Model.caseInternal.CreatedNIK" disabled="disabled"/>
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.CreatedBy)
</div>
<div class="editor-field">
#Html.TextBoxFor(model => model.caseInternal.CreatedBy, new { disabled = "disabled" })
#Html.ValidationMessageFor(model => model.caseInternal.CreatedBy)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.CreatedDt)
</div>
<div class="editor-field">
#Html.TextBoxFor(model => model.caseInternal.CreatedDt, new { disabled = "disabled" })
#Html.ValidationMessageFor(model => model.caseInternal.CreatedDt)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.AssignGroupID)
</div>
<div class="editor-field">
#Html.DropDownList("AssignGroupID", null, new { #onchange = "javascript:memberdropdown();" })
#Html.ValidationMessageFor(model => model.caseInternal.AssignGroupID)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.AssignMemberID)
</div>
<div class="editor-field">
#Html.DropDownList("AssignMemberID", String.Empty)
#Html.ValidationMessageFor(model => model.caseInternal.AssignMemberID)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.StatusID)
</div>
<div class="editor-field">
#Html.DropDownList("StatusID",null, new { #disabled = "disabled" })
#Html.ValidationMessageFor(model => model.caseInternal.StatusID)
</div>
</div>
<div class="one-third column">
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.SLA)
</div>
<div class="editor-field">
#Html.TextBoxFor(model => model.caseInternal.SLA, new { disabled = "disabled" })
#Html.ValidationMessageFor(model => model.caseInternal.SLA)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.SLAFlag)
</div>
<div class="editor-field">
#Html.TextBoxFor(model => model.caseInternal.SLAFlag, new { disabled = "disabled" })
#Html.ValidationMessageFor(model => model.caseInternal.SLAFlag)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.DayResolved)
</div>
<div class="editor-field">
#Html.TextBoxFor(model => model.caseInternal.DayResolved, new { disabled = "disabled" })
#Html.ValidationMessageFor(model => model.caseInternal.DayResolved)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.DatCreated)
</div>
<div class="editor-field">
#Html.TextBoxFor(model => model.caseInternal.DatCreated, new { disabled = "disabled" })
#Html.ValidationMessageFor(model => model.caseInternal.DatCreated)
</div>
</div>
<div class="sixteen columns">
<div class="fbgreybox" >
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.Description)
</div>
<div class="editor-field">
#Html.TextAreaFor(model => model.caseInternal.Description, new { style = "width: 100%; height: 100px;" })
#Html.ValidationMessageFor(model => model.caseInternal.Description)
</div>
<div class="editor-label">
#Html.LabelFor(model => model.caseInternal.LinkCase)
</div>
<div class="editor-field">
#Html.EditorFor(model => model.caseInternal.LinkCase)
#Html.ValidationMessageFor(model => model.caseInternal.LinkCase)
</div>
</div>
<p>
<input type="submit" value="Save" class="uibutton large confirm"/>
#Html.ActionLink("Back to List", "Index", "CaseInternal", new { #class = "uibutton" })
</p>
</div>
</div>
}
</fieldset>
</div>
#using (Ajax.BeginForm("Comment", "CaseInternal", new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid", OnSuccess = "done" }))
{
#*<input type="text" id="caseEka" name="caseEka" />*#
#Html.HiddenFor(model => model.caseIDComment)
<input type="text" id="Comment" name="Comment"/>
}
<div id="myGrid">
#Html.Partial("_showComment", Model.caseComment)
</div>
<script type="text/javascript">
function done() {
document.getElementById('Comment').value = '';
}
function cascadingdropdown() {
var idDept = $("#ProjectID").val();
var subProject = $('#SubProjectID').val();
var urlemp = '#Url.Action("GetSubProjectFromProjectID")';
var select = $('#SubProjectID');
$.ajax({
type: "POST",
url: urlemp,
data: { id: idDept },
error: function (jqXHR, textStatus, errorThrown) {
alert("error" + jqXHR.responseText);
},
success: function (returndata) {
if (returndata.ok) {
select.empty();
$.each(returndata.data, function (index, itemData) {
if (subProject == itemData.ID) {
select.append($('<option selected="selected"></option>').val(itemData.ID).html(itemData.SubProjectName));
} else {
select.append($('<option></option>').val(itemData.ID).html(itemData.SubProjectName));
}
});
select.show('slow');
// $("#ProjectID").attr("disabled", "disabled");
}
else {
window.alert(' error : ' + returndata.message);
}
}
}
);
}
function getNameNik() {
window.alert("AAAASSDSD");
var idDept = $("#CreatedNIK").val();
var urlemp = '#Url.Action("GetNameNik")';
$.ajax({
type: "POST",
url: urlemp,
data: { id: idDept },
error: function (jqXHR, textStatus, errorThrown) {
alert("error" + jqXHR.responseText);
},
success: function (returndata) {
if (returndata.ok) {
$('#nikLabel').text("");
$.each(returndata.data, function (index, itemData) {
$('#nikLabel').text(itemData.FirstName + " " + itemData.LastName);
});
}
else {
window.alert(' error : ' + returndata.message);
}
}
}
);
}
function memberdropdown() {
var idDept = $("#AssignGroupID").val();
var subProject = $('#AssignMemberID').val();
var urlemp = '#Url.Action("GetMemberFromGroupID")';
var select = $('#AssignMemberID');
$.ajax({
type: "POST",
url: urlemp,
data: { id: idDept },
error: function (jqXHR, textStatus, errorThrown) {
alert("error" + jqXHR.responseText);
},
success: function (returndata) {
select.empty();
if (returndata.ok) {
$.each(returndata.data, function (index, itemData) {
if (subProject == itemData.ID) {
select.append($('<option selected="selected"></option>').val(itemData.ID).html(itemData.UserName));
} else {
select.append($('<option></option>').val(itemData.ID).html(itemData.UserName));
}
});
select.show('slow');
// $("#ProjectID").attr("disabled", "disabled");
}
else {
window.alert(' error : ' + returndata.message);
}
}
}
);
}
function start() {
cascadingdropdown();
memberdropdown();
}
window.onload = start;
// window.onload = memberdropdown;
</script>
and here my controller:
public ActionResult Edit(string id)
{
CaseInternal caseinternal = db.CaseInternals.Find(id);
caseinternal.NullSafeTrimStrings();
ViewBag.PengaduanID = new SelectList(db.InternalPPengaduans, "ID", "PPengaduanName", caseinternal.PengaduanID);
ViewBag.ProjectID = new SelectList(db.InternalProjects, "ID", "ProjectName", caseinternal.ProjectID);
ViewBag.SubProjectID = new SelectList(db.InternalSubProjects, "ID", "SubProjectName", caseinternal.SubProjectID);
ViewBag.CategoryID = new SelectList(db.MasterCategories, "ID", "CategoryName", caseinternal.CategoryID);
ViewBag.AssignGroupID = new SelectList(db.MasterGroups, "ID", "GroupName", caseinternal.AssignGroupID);
ViewBag.AssignMemberID = new SelectList(db.MasterAssignUsers, "ID", "UserName", caseinternal.AssignMemberID);
ViewBag.BranchID = new SelectList(branchObject.A2BR, "BRCODE", "BRNAME", caseinternal.BranchID);
ViewBag.StatusID = new SelectList(db.MasterStatus, "ID", "StatusName", caseinternal.StatusID);
CaseInternalEditViewModel caseInternalEdit = new CaseInternalEditViewModel();
caseInternalEdit.caseInternal = caseinternal;
caseInternalEdit.caseIDComment = caseinternal.CaseID;
var commentCase = db.CaseComments.Where(p => p.CaseID == caseinternal.CaseID).OrderByDescending(p => p.CreatedDt);
foreach (CaseComment cas in commentCase)
{
caseInternalEdit.caseComment.Add(cas);
}
return View(caseInternalEdit);
}
[HttpPost]
public ActionResult Edit(CaseInternalEditViewModel caseinternalEdit)
{
//CaseInternalEditViewModel caseinternalEdit
CaseInternal caseinternal = caseinternalEdit.caseInternal;
if (ModelState.IsValid)
{
db.Entry(caseinternal).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.PengaduanID = new SelectList(db.InternalPPengaduans, "ID", "PPengaduanName", caseinternal.PengaduanID);
ViewBag.ProjectID = new SelectList(db.InternalProjects, "ID", "ProjectName", caseinternal.ProjectID);
ViewBag.SubProjectID = new SelectList(db.InternalSubProjects, "ID", "SubProjectName", caseinternal.SubProjectID);
ViewBag.CategoryID = new SelectList(db.MasterCategories, "ID", "CategoryName", caseinternal.CategoryID);
ViewBag.AssignGroupID = new SelectList(db.MasterGroups, "ID", "GroupName", caseinternal.AssignGroupID);
ViewBag.AssignMemberID = new SelectList(db.MasterAssignUsers, "ID", "UserName", caseinternal.AssignMemberID);
ViewBag.BranchID = new SelectList(branchObject.A2BR, "BRCODE", "BRNAME", caseinternal.BranchID);
ViewBag.StatusID = new SelectList(db.MasterStatus, "ID", "StatusName", caseinternal.StatusID);
return View(caseinternalEdit);
}
the modelstate is always invalid, because some field is null, field2 in dropdownlist is null when passing to controller.
is the viewbag the problem? should i change the name of viewbag?
#Html.EditorFor(model => model.caseInternal.Title)
is rendered to
<input class="text-box single-line" id="caseInternal_Title" name="caseInternal.Title" type="text" value="ViewModel" />
but dropdownlist
<select id="BranchID" name="BranchID"><option selected="selected" value="001">KANTOR PUSAT NON OPERASIONAL </option>
the different is the name, the branch should be caseinternal.branchID maybe it will work, but how to do that?
You have:
#Html.DropDownList("BranchID")
You want:
#Html.DropDownListFor(model => model.caseInternal.BranchID)
OR if you really don't want to use a DropDownListFor() for whatever reason....
#Html.DropDownList("caseInternal_BranchID")
Related
Passing Model to the partial view doesn't work
The file "Add.cshtml" is calling the partial view "_ManagePartial.cshtml" and passing the "Model""however the "Model " is not being picked up in the partial view. When I include the code that's on the partial view into "Add.cshtml" everything works great. Please advise what I''m doing wrong. Error Message: Click here to see the error message screenshot File: _ManagePartial.cshtml <div class="row"> <div class="col-md-4"> <div class="form-group"> #Html.LabelFor(model => model.UserName) #Html.EditorFor(model => model.UserName, new { htmlAttributes = new { #class = "form-control input-lg" } }) #Html.ValidationMessageFor(model => model.UserName, "", new { #class = "text-danger" }) </div> <div class="form-group"> #Html.LabelFor(model => model.UserPassword) #Html.EditorFor(model => model.UserPassword, new { htmlAttributes = new { #class = "form-control input-lg" } }) #Html.ValidationMessageFor(model => model.UserPassword, "", new { #class = "text-danger" }) </div> <div class="form-group"><button type="submit" class="btn btn-primary btn-lg">Submit</button></div> </div> <div class="col-md-4"> <div class="form-group"> #Html.LabelFor(model => model.UserEmail) #Html.EditorFor(model => model.UserEmail, new { htmlAttributes = new { #class = "form-control input-lg" } }) #Html.ValidationMessageFor(model => model.UserEmail, "", new { #class = "text-danger" }) </div> <div class="form-group"> #Html.LabelFor(model => model.UserConfirmPassword) <input type="password" class="form-control input-lg" name="UserConfirmPassword"> </div> </div> </div> File: Add.cshtml #model CardDistro.Models.AddUserViewModel #{ ViewBag.Current = "Users#Index"; String Action = ViewBag.FormAction; } <h2 class="page-header">#ViewBag.Title</h2> #using (Html.BeginForm(Action, "Users", FormMethod.Post, new { id = "SiteAddUserContainer" })) { <input type="hidden" name="UserID" value="#Model.UserID" /> if (ViewBag.Retval != null){ <div class="row"><div class="col-md-8"><div class="alert alert-danger">#ViewBag.Retval</div></div></div> } Html.RenderPartial("_ManagePartial", Model); }
_ManagePartial.cshtml needs to identify the model by starting the partial view with #model CardDistro.Models.AddUserViewModel so the compiler knows what to do with model=>UserName
Uploading Image in Asp.net mvc Controller
I have a Upload form and I want to pass my information such as an Image and some other field but I don't know how can I upload Image .. This is My model class public partial class NewProductCategory { public string ProductName { get; set; } public string ProductDescription { get; set; } public string ProductPrice { get; set; } public string ProductImage { get; set; } public string ProductQuantity { get; set; } public Nullable<bool> ProductStatus { get; set; } public Nullable<int> CategoryId { get; set; } public HttpPostedFileBase user_image_data { get; set; } public virtual Category Category { get; set; } } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(NewProductCategory productcategory, HttpPostedFileBase file) { if (ModelState.IsValid) { ProductCategory newproductCategory = new ProductCategory(); string path = Path.Combine(Server.MapPath("~/Content/files"), Path.GetFileName(file.FileName)); file.SaveAs(path); newproductCategory.ProductDescription = productcategory.ProductDescription; newproductCategory.ProductQuantity = productcategory.ProductQuantity; newproductCategory.ProductStatus = productcategory.ProductStatus; newproductCategory.CategoryId = productcategory.CategoryId; db.ProductCategories.Add(newproductCategory); db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.CategoryId = new SelectList(db.Categories, "CategoryId", "Name", productcategory.CategoryId); return View(productcategory); } And this is My View Code #model MvcApplication1.Models.NewProductCategory #{ ViewBag.Title = "Create"; } <h2>Create</h2> #using (Html.BeginForm()) { #Html.AntiForgeryToken() #Html.ValidationSummary(true) <fieldset> <legend>ProductCategory</legend> #using (Html.BeginForm("Create", "Temp", FormMethod.Post, new { enctype = "multipart/form-data" })) { <div class="editor-label"> #Html.LabelFor(model => model.ProductName) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductName) #Html.ValidationMessageFor(model => model.ProductName) </div> <div class="editor-label"> #Html.LabelFor(model => model.ProductDescription) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductDescription) #Html.ValidationMessageFor(model => model.ProductDescription) </div> <div class="editor-label"> #Html.LabelFor(model => model.ProductPrice) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductPrice) #Html.ValidationMessageFor(model => model.ProductPrice) </div> <div class="editor-label"> #Html.LabelFor(model => model.user_image_data) </div> <div class="editor-label"> #Html.Label("Upload your image") </div> <div class="editor-field"> #Html.TextBoxFor(model => model.user_image_data, new { Type = "File" }) #Html.ValidationMessageFor(model => model.user_image_data) </div> <div class="editor-label"> #Html.LabelFor(model => model.ProductQuantity) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductQuantity) #Html.ValidationMessageFor(model => model.ProductQuantity) </div> <div class="editor-label"> #Html.LabelFor(model => model.ProductStatus) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductStatus) #Html.ValidationMessageFor(model => model.ProductStatus) </div> <div class="editor-label"> #Html.LabelFor(model => model.CategoryId, "Category") </div> <div class="editor-field"> #Html.DropDownList("CategoryId", String.Empty) #Html.ValidationMessageFor(model => model.CategoryId) </div> <p> <input type="submit" value="Create" /> </p> } </fieldset> } please help me in controller i am getting Null value for File upload
Update Ansawer #model MvcApplication1.Models.NewProductCategory #{ ViewBag.Title = "Create"; } #using (Html.BeginForm("Create", "Temp", FormMethod.Post, new { enctype = "multipart/form-data" })) { #Html.AntiForgeryToken() #Html.ValidationSummary(true) <fieldset> <legend>ProductCategory</legend> <div class="editor-label"> #Html.LabelFor(model => model.ProductName) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductName) #Html.ValidationMessageFor(model => model.ProductName) </div> <div class="editor-label"> #Html.LabelFor(model => model.ProductDescription) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductDescription) #Html.ValidationMessageFor(model => model.ProductDescription) </div> <div class="editor-label"> #Html.LabelFor(model => model.ProductPrice) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductPrice) #Html.ValidationMessageFor(model => model.ProductPrice) </div> <div class="editor-label"> #Html.LabelFor(model => model.user_image_data) </div> <div class="editor-field"> #Html.TextBoxFor(model => model.user_image_data, new { Type = "File" }) #Html.ValidationMessageFor(model => model.user_image_data) </div> <div class="editor-label"> #Html.Label("Upload your image") </div> <div class="editor-label"> #Html.TextBox("file",null,htmlAttributes: new { Type = "file" }) </div> <div class="editor-label"> #Html.LabelFor(model => model.ProductQuantity) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductQuantity) #Html.ValidationMessageFor(model => model.ProductQuantity) </div> <div class="editor-label"> #Html.LabelFor(model => model.ProductStatus) </div> <div class="editor-field"> #Html.EditorFor(model => model.ProductStatus) #Html.ValidationMessageFor(model => model.ProductStatus) </div> <div class="editor-label"> #Html.LabelFor(model => model.CategoryId, "Category") </div> <div class="editor-field"> #Html.DropDownList("CategoryId", String.Empty) #Html.ValidationMessageFor(model => model.CategoryId) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> }
Html.ActionLink doesn't call at all
I am having some problems solving this. The thing is, this is the only place it doesn't work, everywhere else in my project it works just fine and it's all the same. here is my link: <td class="col-sm-1 col-lg-1">#Html.ActionLink("Edit", "EditGrowWeek", "FinishedProductionMaintanance", new { #id = Model.growWeek.GWID }, new { #data_toggle = "modal", #data_target = "#editGrowWeek" })</td> my controller: [HttpGet] public ActionResult EditGrowWeek(int id) { viewModel.growWeek = _ProductionGrowWeekRepository.GetOne(id); return PartialView(viewModel); } [HttpPost] //[ValidateAntiForgeryToken] public ActionResult EditGrowWeek([Bind(Prefix="growWeek")] ProductionGrowWeek growWeek) { var growWeeks = _ProductionGrowWeekRepository.GetAll(growWeek.GProfileNo); foreach (var week in growWeeks) { if (ModelState.IsValid) { _ProductionGrowWeekRepository.Edit(week); } } return RedirectToAction("IndexGrowProfiles"); } and finally my view: #model SISCOM.ViewModel.FinishedProductionMaintananceViewModel #{ Layout = null; } <div class="modal fade in" id="editGrowWeek" tabindex="-1" role="dialog" aria-labelledby="MyModalLabel"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dissmiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> </div> <div class="modal-body"> #using (Html.BeginForm("EditGrowWeek", "FinishedProductionMaintanance", FormMethod.Post)) { #*#Html.AntiForgeryToken()*# <form id="form"> #Html.ValidationSummary(true) #Html.HiddenFor(model => model.growWeek.GWID) #Html.HiddenFor(model => model.growWeek.CutSupplierCode) #Html.HiddenFor(model => model.growWeek.DelvyWk) #Html.HiddenFor(model => model.growWeek.Description_ID_) #Html.HiddenFor(model => model.growWeek.Description_Product_) #Html.HiddenFor(model => model.growWeek.Despatch) #Html.HiddenFor(model => model.growWeek.FinishedDuration) #Html.HiddenFor(model => model.growWeek.FinishedSite) #Html.HiddenFor(model => model.growWeek.GapUpHandSite) #Html.HiddenFor(model => model.growWeek.GapUpMCSite) #Html.HiddenFor(model => model.growWeek.GerminationDuration) #Html.HiddenFor(model => model.growWeek.GerminationSite) #Html.HiddenFor(model => model.growWeek.Germinator) #Html.HiddenFor(model => model.growWeek.GerminatorDuration) #Html.HiddenFor(model => model.growWeek.GerminatorSite) #Html.HiddenFor(model => model.growWeek.GProfileNo) #Html.HiddenFor(model => model.growWeek.GrowWks1) #Html.HiddenFor(model => model.growWeek.GrowWks2) #Html.HiddenFor(model => model.growWeek.GrowWks3) #Html.HiddenFor(model => model.growWeek.GrowWks4) #Html.HiddenFor(model => model.growWeek.GrowWks5) #Html.HiddenFor(model => model.growWeek.OrderWK) #Html.HiddenFor(model => model.growWeek.PreGapDuration) #Html.HiddenFor(model => model.growWeek.PreGapSite) #Html.HiddenFor(model => model.growWeek.PrickOut) #Html.HiddenFor(model => model.growWeek.PrickOutSite) #Html.HiddenFor(model => model.growWeek.Priority) #Html.HiddenFor(model => model.growWeek.ProdGrp) #Html.HiddenFor(model => model.growWeek.ProdSeries) #Html.HiddenFor(model => model.growWeek.ProdSeriesDetail) #Html.HiddenFor(model => model.growWeek.ProductionGrowProfile) #Html.HiddenFor(model => model.growWeek.RangeUpdateFlag) #Html.HiddenFor(model => model.growWeek.Rooting_GermAssess) #Html.HiddenFor(model => model.growWeek.SiteGrown) #Html.HiddenFor(model => model.growWeek.SiteRange) #Html.HiddenFor(model => model.growWeek.SiteSown) #Html.HiddenFor(model => model.growWeek.Topping) #Html.HiddenFor(model => model.growWeek.ToppingCode) #Html.HiddenFor(model => model.growWeek.Transplant) <div class="form-group"> <div class="editor-label"> #Html.LabelFor(p => p.growWeek.WksToDesp, "Weeks to despatch") </div> <div class="editor-field"> #Html.TextBoxFor(p => p.growWeek.WksToDesp, null, new { #class = "form-control", #placeholder = "Weeks to despatch" }) #Html.ValidationMessageFor(p => p.growWeek.WksToDesp, "", new { #class = "text-danger" }) </div> </div> <div class="form-group"> <div class="editor-label"> #Html.LabelFor(p => p.growWeek.GapUp, "Gap up") </div> <div class="editor-field"> #Html.TextBoxFor(p => p.growWeek.GapUp, null, new { #class = "form-control", #placeholder = "Gap up" }) #Html.ValidationMessageFor(p => p.growWeek.GapUp, "", new { #class = "text-danger" }) </div> </div> <div class="form-group"> <div class="editor-label"> #Html.LabelFor(p => p.growWeek.Pinch1, "Pinch1") </div> <div class="editor-field"> #Html.TextBoxFor(p => p.growWeek.Pinch1, null, new { #class = "form-control", #placeholder = "Pinch1" }) #Html.ValidationMessageFor(p => p.growWeek.Pinch1, "", new { #class = "text-danger" }) </div> </div> <div class="form-group"> <div class="editor-label"> #Html.LabelFor(p => p.growWeek.Pinch2, "Pinch2") </div> <div class="editor-field"> #Html.TextBoxFor(p => p.growWeek.Pinch2, null, new { #class = "form-control", #placeholder = "Pinch2" }) #Html.ValidationMessageFor(p => p.growWeek.Pinch2, "", new { #class = "text-danger" }) </div> </div> <div class="form-group"> <div class="editor-label"> #Html.LabelFor(p => p.growWeek.Space1, "Space1") </div> <div class="editor-field"> #Html.TextBoxFor(p => p.growWeek.Space1, null, new { #class = "form-control", #placeholder = "Space1" }) #Html.ValidationMessageFor(p => p.growWeek.Space1, "", new { #class = "text-danger" }) </div> </div> <div class="form-group"> <div class="editor-label"> #Html.LabelFor(p => p.growWeek.Space2, "Space2") </div> <div class="editor-field"> #Html.TextBoxFor(p => p.growWeek.Space2, null, new { #class = "form-control", #placeholder = "Space2" }) #Html.ValidationMessageFor(p => p.growWeek.Space2, "", new { #class = "text-danger" }) </div> </div> <div class="form-group"> <div class="editor-label"> #Html.LabelFor(p => p.growWeek.Space3, "Space3") </div> <div class="editor-field"> #Html.TextBoxFor(p => p.growWeek.Space3, null, new { #class = "form-control", #placeholder = "Space3" }) #Html.ValidationMessageFor(p => p.growWeek.Space3, "", new { #class = "text-danger" }) </div> </div> <div class="form-group"> <div class="editor-label"> #Html.LabelFor(p => p.growWeek.Check1, "Check1") </div> <div class="editor-field"> #Html.TextBoxFor(p => p.growWeek.Check1, null, new { #class = "form-control", #placeholder = "Check1" }) #Html.ValidationMessageFor(p => p.growWeek.Check1, "", new { #class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Edit" class="btn btn-default" /> </div> </div> </form> } </div> </div> </div> </div> I've been checking everywhere and this one doesn't make a call at all... any ideeas? P.S. ... this might be connected so, on this page, (On the index that renders this partial) my footer is being rendered somewhere in the middle of my page in code..
This doesn't make a lot of sense but here it is. The problem was that everytime i generated values for that table it removed the partial view following it for some reason (if anyone can make sense of this behaviour and can explain please do.) so, my index for this page used to look like this: <div class="tab-content col-md-9 col-lg-9 growProfilePage"> <div class="col-md-12 col-lg-12"> <div class="col-md-4"> #{ Html.RenderPartial("ListGrowProfiles");} </div> <div class="col-md-8"> #{ Html.RenderPartial("ListGrowWeeks");} #{ Html.RenderPartial("EditGrowWeek");} </div> </div> </div> now it looks like this: <div class="tab-content col-md-9 col-lg-9 growProfilePage"> <div class="col-md-12 col-lg-12"> #{ Html.RenderPartial("EditGrowWeek");} <div class="col-md-4"> #{ Html.RenderPartial("ListGrowProfiles");} </div> <div class="col-md-8"> #{ Html.RenderPartial("ListGrowWeeks");} </div> </div> </div> and it all works (curiously enough, on other pages it's still like before, the edit following the list and it works like that).
ViewModel does not populate input fields
I have a ViewModel that is used for an edit View. When the data is returned, the ID of the item to be edited does not display on the edit View. public ActionResult Edit(int id) { Parcel parcel = _parcelDao.GetParcel(id); ParcelEditViewModel viewModel = new ParcelEditViewModel(); viewModel.id = parcel.id; return View(viewModel); } Should I be returning something different to the View? ViewModel: public class ParcelEditViewModel { public Parcel parcel { get; set; } public int id { get; set; } public IEnumerable<SelectListItem> TrackStatus { get; set; } public ParcelEditViewModel() { parcel = new Parcel(); TrackStatus = new List<SelectListItem> { new SelectListItem { Value = "AwaitingCollection", Text = "Awaiting Collection" }, new SelectListItem { Value = "OutForDelivery", Text = "Out For Delivery" }, new SelectListItem { Value = "Delivered", Text = "Delivered" } }; } public int ParcelStatus { get; set; } } View: //#model ABC.Data.Parcel #model Abc.ViewModels.ParcelEditViewModel #{ ViewBag.Title = "Edit"; } <h2>Edit</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>Parcel</legend> #Html.HiddenFor(model => model.parcel.id) <div class="editor-label"> #Html.LabelFor(model => model.parcel.Forename) </div> <div class="editor-field"> #Html.EditorFor(model => model.parcel.Forename) #Html.ValidationMessageFor(model => model.parcel.Forename) </div> <div class="editor-label"> #Html.LabelFor(model => model.parcel.Surname) </div> <div class="editor-field"> #Html.EditorFor(model => model.parcel.Surname) #Html.ValidationMessageFor(model => model.parcel.Surname) </div> <div class="editor-label"> #Html.LabelFor(model => model.parcel.CompanyName) </div> <div class="editor-field"> #Html.EditorFor(model => model.parcel.CompanyName) #Html.ValidationMessageFor(model => model.parcel.CompanyName) </div> <div class="editor-label"> #Html.LabelFor(model => model.parcel.Address1) </div> <div class="editor-field"> #Html.EditorFor(model => model.parcel.Address1) #Html.ValidationMessageFor(model => model.parcel.Address1) </div> <div class="editor-label"> #Html.LabelFor(model => model.parcel.Address2) </div> <div class="editor-field"> #Html.EditorFor(model => model.parcel.Address2) #Html.ValidationMessageFor(model => model.parcel.Address2) </div> <div class="editor-label"> #Html.LabelFor(model => model.parcel.Address3) </div> <div class="editor-field"> #Html.EditorFor(model => model.parcel.Address3) #Html.ValidationMessageFor(model => model.parcel.Address3) </div> <div class="editor-label"> #Html.LabelFor(model => model.parcel.Postcode) </div> <div class="editor-field"> #Html.EditorFor(model => model.parcel.Postcode) #Html.ValidationMessageFor(model => model.parcel.Postcode) </div> <div class="editor-label"> #Html.LabelFor(model => model.ParcelStatus) </div> <div class="editor-field"> #Html.DropDownListFor(model => model.parcel.TrackingStatus, Model.TrackStatus) #Html.ValidationMessageFor(model => model.ParcelStatus) </div> <div class="editor-label"> #Html.LabelFor(model => model.parcel.TrackingNumber) </div> <div class="editor-field"> #Html.EditorFor(model => model.parcel.TrackingNumber) #Html.ValidationMessageFor(model => model.parcel.TrackingNumber) </div> <div class="editor-label"> #Html.LabelFor(model => model.parcel.CustomerId) </div> <div class="editor-field"> #Html.EditorFor(model => model.parcel.CustomerId) #Html.ValidationMessageFor(model => model.parcel.CustomerId) </div> <p> <input type="submit" value="Save" /> </p> </fieldset> } <div> #Html.ActionLink("Back to List", "Index")
You need to populate all of your view model's properties; not just the ID. The ParcelEditViewModel has no knowledge of what's in your database. public ActionResult Edit(int id) { Parcel parcel = _parcelDao.GetParcel(id); ParcelEditViewModel viewModel = new ParcelEditViewModel(); viewModel.id = parcel.id; // Populate other properties! These may not be right. viewModel.ProductName = parcel.Title; viewModel.RecipientName; = parcel.RecipientName; return View(viewModel); } There are mapping libraries such as AutoMapper that can help to streamline this.
Ajax.BeginForm redirects action page(MVC 4)
I use 'Ajax.BeginForm' in my application,but for some reason my form is redirecting to {controller}/{action} with right json data instead of start {OnComplete = "Add_OnComplete"}: View: <script src="#Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script> <script src="#Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> <script src="#Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> #using (Ajax.BeginForm("Create", new AjaxOptions { OnComplete = "Add_OnComplete"})) { <fieldset> <legend>Add</legend> <div class="editor-label"> #Html.LabelFor(model => model.FullName) </div> <div class="editor-field"> #Html.TextBoxFor(model => model.FullName) #Html.ValidationMessageFor(model => model.FullName) </div> <div class="editor-label"> #Html.LabelFor(model => model.Email) </div> <div class="editor-field"> #Html.TextBoxFor(model => model.Email) #Html.ValidationMessageFor(model => model.Email) </div> <div class="editor-label"> #Html.LabelFor(model => model.PhoneNumber) </div> <div class="editor-field"> #Html.TextBoxFor(model => model.PhoneNumber) #Html.ValidationMessageFor(model => model.PhoneNumber) </div> <div class="editor-label"> #Html.LabelFor(model => model.Status) </div> <div class="editor-field"> #Html.TextBoxFor(model => model.Status) #Html.ValidationMessageFor(model => model.Status) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> } <script type="text/javascript"> function Add_OnComplete(context) { var JsonAdd = context.get_response().get_object(); if (JsonAdd.Success) { //TODO } } </script> Controller: public PartialViewResult Create() { return PartialView(); } [HttpPost] public JsonResult Create(Subscribe model) { if (ModelState.IsValid) { _entity.CreateSubscribe(model, SubscribeStatus.Customer.GetHashCode()); var message = new Message(MailSubject, MailBody, model.Email); message.Send(); } return Json(new { Success = true, Message = "The person has been added!" }); } What I do wrong ? And what am I missing? Thanks.
Remove that get_response().get_object() stuff. Use just context.Success