私は今あなたと違う、より良いアプローチを取っておきたいと思います。同じページにC#、javascript、HTMLを混在させているのがわかりますタグをつけたスジ。
改善番号1:foreachループの代わりにエディタテンプレートを使用します。メインビューではなく、あなたは、単にあなたの質問に投稿した内容の書き込み:その後、
<%= Html.EditorForModel() %>
し、モデルコレクション(~/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>
部分名は、厳密に型指定された型名(Person.ascx
)と同じであることに注意してください。また、次の場所に気付く:~/Views/Home/EditorTemplates
ここで、Home
はもちろん、現在のコントローラの名前です。複数のコントローラ間で再利用したい場合は、~/Views/Shared/EditorTemplates
に配置することもできます。エディタテンプレートはビューモデルに強く型付けされているので、Html.TextBoxFor
のような強く型付けされたヘルパーを使うことができます。そのため、テキストボックスの名前と値を手動でハードコードする必要がなく、モデルバインダが正しく動作しないのはなぜですか?
改善番号2:徐々に別々のJavaScriptファイルにjQueryを使ってマークアップを強化:ASPはサーバーサイドである一方、
$(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;
});
});
フレデリック、Omkarはあなたの直前に来ましたが、私はそれをマークしました:) –