たとえば、json シリアライゼーションを使用してそれを行うことができます。非常に柔軟でエレガントに見えるので、これをお勧めします。
モデルには、オブジェクトの任意のセットを含めることができます。あなたの場合は次のとおりです。
public class MyViewModel
{
public IDictionary<string, string> BookVars { get; set; }
}
コントローラーでは、必要に応じていくつかのデータをスタブできます。
public class HomeController : Controller
{
public ActionResult Index()
{
// mock data
var model = new MyViewModel
{BookVars = new Dictionary<string, string> {{"key1", "value1"}, {"key2", "value2"}}};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
// the binded model is avaliable
return View(model);
}
}
ビューにはフォームが含まれており、ajax 送信用のカスタム スクリプトが含まれています。値は、どのような方法でも永続化および変更できます。たとえば、隠しフィールドを使用できます。
@model MyViewModel
<script src="/Scripts/script.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
$('form').frmBookSubmit();
});
</script>
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { name = "frmBook" }))
{
<div class="books">
@foreach (var item in Model.BookVars)
{
<input type="hidden" key="@item.Key" value="@item.Value" />
}
</div>
<input type="submit" />
}
Script.js は、データの json シリアル化を使用して ajax 送信用の単純な jquery プラグインを作成します。
(function ($) {
$.fn.frmBookSubmit = function () {
var $this = $(this);
if ($this != null && $this != 'undefined' && $this.length > 0) {
$this.submit(function (e) {
e.preventDefault();
var myviewmodel = new Object();
myviewmodel.BookVars = $this.find(".books").booksCollect();
var data = { model: myviewmodel };
var jsonString = JSON.stringify(data);
$.ajax({
url: $this.attr("action"),
type: 'POST',
dataType: 'json',
data: jsonString,
contentType: 'application/json; charset=utf-8'
});
});
}
};
$.fn.booksCollect = function () {
var books = new Array();
$(this).find("input").each(function () {
var k = $(this).attr('key');
var v = $(this).attr('value');
var item = {
Key: k,
Value: v
};
books.push(item);
});
return books;
};
})(jQuery);
便利な場合は、たとえば Newtonsoft.Json ライブラリを使用してカスタム json バインダーを作成することもできます。
あなたは終わった。