Если вы хотите вернуть значения обратно в действие, которое вы публикуете, вам необходимо отправить их вместе с запросом.Использование скрытых полей является одним из способов сделать это.Другой способ - отправить только идентификатор, который позволит вам извлечь эти значения из репозитория в действии контроллера, которое вы публикуете, так же, как вы делаете это в действии контроллера, которое отображает форму.
Если вас беспокоит вмешательство пользователей в скрытые поля, вы можете сериализовать и зашифровать целые объекты, используя Html.Serialize .
ОБНОВЛЕНИЕ:
Вот примерразверните мое второе предложение, которое должно было использовать идентификатор:
<% Html.BeginForm("Save", "Products", FormMethod.Post) { %>
<%: Html.Hidden("id", "PUT AN ID HERE WHICH IDENTIFIES THE ITEM")
<% foreach (KeyValuePair<int, Prototype> p in Model) { %>
<%: Html.Label(p.Value.PropertyName) %>
<%: Html.TextBox("Value") %>
<% } %>
<p><input type="submit" value="submit" /></p>
<% } %>
и в вашем действии контроллера:
public ActionResult Save(string id, ....)
{
var data = SomeRepository.FetchData(id);
...
}