Вот что я бы вам предложил.Начнем с модели представления, которая будет представлять строку таблицы:
public class MyViewModel
{
public int Id { get; set; }
[Required]
public string SystemName { get; set; }
public string TaskName { get; set; }
}
, затем контроллер, который будет содержать действия для перечисления всех моделей и обновления одной строки:
public class HomeController : Controller
{
public ActionResult Index()
{
// I have hardcoded some data here in order to return a list
// of models => in your case you would probably fetch those from
// some data source
var model = Enumerable.Range(1, 7).Select(x => new MyViewModel
{
Id = x,
SystemName = "system " + x,
TaskName = "task " + x
});
return View(model);
}
[HttpPost]
public ActionResult Update(MyViewModel model)
{
// This action will be responsible for updating the view model
if (ModelState.IsValid)
{
// The model is valid
// TODO: update it using a repository
return Json(new { success = true });
}
// there was an error => redisplay the view so that the user can fix it
return PartialView("_MyViewModel", model);
}
}
Затем давайте перейдемна главном виде (~/Views/Home/Index.aspx
):
<%@ Page
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<IEnumerable<AppName.Models.MyViewModel>>"
%>
...
<table>
<thead>
<tr>
<th>Id</th>
<th>System name</th>
<th>Task name</th>
<th></th>
</tr>
</thead>
<tbody>
<% if (Model == null || Model.Count() < 1) { %>
<tr>
<td colspan="4">
No Records found !! Please search.
</td>
</tr>
<% } else { %>
<% foreach (var item in Model) { %>
<%= Html.Partial("_MyViewModel", item) %>
<% } %>
<% } %>
</tbody>
</table>
Затем мы определяем частичное для модели вида (~/Views/Home/_MyViewModel.ascx
):
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.MyViewModel>"
%>
<tr>
<% using (Html.BeginForm("Update", "Home", FormMethod.Post, new { @class = "updateForm" })) { %>
<td>
<%= Html.DisplayFor(x => x.Id) %>
<%= Html.HiddenFor(x => x.Id) %>
</td>
<td>
<%= Html.EditorFor(x => x.SystemName) %>
<%= Html.ValidationMessageFor(x => x.SystemName) %>
</td>
<td>
<%= Html.EditorFor(x => x.TaskName) %>
<%= Html.ValidationMessageFor(x => x.TaskName) %>
</td>
<td>
<input type="submit" value="Update" />
</td>
<% } %>
</tr>
и последняя часть должнаОслабьте эти формы.Это можно сделать незаметно в отдельном файле JavaScript с помощью jquery:
$(function() {
$('.updateForm').submit(function () {
var form = $(this);
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (result) {
if (!result.success) {
form.closest('tr').replaceWith(result);
} else {
alert('record successfully updated');
}
}
});
return false;
});
});