I would recommend you taking a different, better approach as right now I see that you are mixing C#, javascript and HTML into the same page which results in what is called horrible tag soup.
So improvement number 1: use editor templates instead of those foreach loops. In your main view instead of writing what you've posted in your question simply:
<%= Html.EditorForModel() %>
and then define an editor template which will be called automatically for each element in your model collection (~/Views/Home/EditorTemplates/Person.ascx):
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<YourApp.Models.Person>" %>
<tr>
<td>
<% using (Html.BeginForm("Save", "Persons",
new { id = Model.Id }, FormMethod.Post,
new { @class = "saveform" })) { %>
<%= Html.TextBoxFor(x => x.Name) %>
<input type="submit" value="Save" />
<% } %>
</td>
</tr>
Notice that the name of the partial is the same as the type name to which it is strongly typed (Person.ascx). Also notice the location: ~/Views/Home/EditorTemplates where Home of course is the name of the current controller. It could also be placed in ~/Views/Shared/EditorTemplates if you wanted to reuse it between multiple controllers. And because the editor template is strongly typed to a view model you can use strongly typed helpers such as Html.TextBoxFor so that you don't have to manually hardcode names and values of the textboxes and wonder why does the model binder doesn't work correctly.
Improvement number 2: progressively enhance your markup with jquery in a separate javascript file:
$(function() {
$('.saveform').submit(function() {
// When the form is submitted
// For example you could call the associated action using AJAX:
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function(result) {
alert('successfully saved');
}
});
return false;
});
});