ASP.NET MVC editing fast a property
There are some moments when you want to fast edit a property ( like a status or a name) and you do not want to load the entire “Edit” form for this.More, you are in an edit formula and do not want to add a form.
So here is the solution in ASP.NET MVC with jquery-1.4.2.min , jquery-ui-1.8.1.custom.min for a modal dialog and some controllers. The most difficult were the javascript, so I let to the final.
We will be editing the name for an employee in 4 steps.The most difficult to understand is the step 4(javascript) , however, it can be re-used with any other object- so you can put it in a common js file.
Step 1
create a view for editing the name , named FastEditEmp
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<BusinessLogic.Employee>" %> <!-- edit inline the name --> <%= Html.HiddenFor(Model=>Model.ID) %> <%= Html.LabelFor(model=>model.Name) %> <%= Html.EditorFor(model=>model.Name) %>
Step 2
Create the controllers and verify it works – at least the get action .
public ActionResult FastEditEmp(int id) { var emp=EmployeeList.LoadFromID(id); return View(emp); } [HttpPost] public ActionResult FastEditEmp(BusinessLogic.Employee emp) { try { var dbid = EmployeeList.LoadFromID(emp.ID); UpdateModel(dbid); dbid.Save(); return new JsonResult() { Data = new { ok = true, message = "succes" } }; } catch (Exception ex) { //TODO : log return new JsonResult() { Data = new { ok = false, message = "error : " + ex.Message } }; } }
Step 3
Create the hyperlink to edit the name of an employee (emp) :
<a href=’javascript:EditModal(<%= emp.ID%>,”<%=Url.Action(“FastEditEmp”,new {id=emp.ID}) %>”)’>Edit name</a>
Step 4
This is the most difficult one, the javascript. However, more of the code is common no matter what you want to edit fast modal :
var wait = '<%= ResolveUrl("~/Content/Images/wait.gif") %>'; function EditModal(empID,url) { // load a please wait dialog var $dialog1 = $('<div></div>') .html("Loading data <br /> <img src='" + wait + "'></img>") .dialog({ autoOpen: false, title: 'please wait' }); $dialog1.dialog('open'); // so the please wait dialog was shown to the user. Now load the content of the action specified in url $.get(url, { ID: empID }, function(txt) { var $dialog = $('#dialog'); $dialog.html(''); $dialog.html(txt) .dialog({ autoOpen: false, title: 'Edit', modal: true, show: 'blind', hide: 'explode', closeOnEscape: false, buttons: { "Close": function() { //just cleanup - no saving var allInputs = $(":input:not(:button)"); var ser = allInputs.serialize(); allInputs.remove(); allInputs.empty(); $(this).dialog("close"); $(this).dialog('destroy'); }, "Save": function() { //now saving data : serializing and posting var allInputs = $(":input:not(:button)"); var ser = allInputs.serialize(); allInputs.remove(); allInputs.empty(); window.alert(ser); -- debug mode $(this).dialog('close'); $(this).dialog('destroy'); //saving data by posting to same url! $.post(url, ser, function(text) { $(this).dialog("close"); $(this).dialog('destroy'); if (text.ok) { window.alert("Saved - you can change here the display id with jquery"); window.location.reload(true); } else { window.alert(text.message); } } ); } } }); $dialog1.dialog('close');//closing the wait dialog $dialog.dialog('open'); // show main editing dialog }); } </script>
As always, please find here the saving modal files. Please execute first the emp.sql file, then modify the connection string into the web.config .