我试图将字典传递给Html.Post中的动作方法
Html.BeginForm("ProcessStage2", "Supplier", new {bookVars = Model.BookVars} , FormMethod.Post, new { name = "frmBook" })
我可以传递模型的其他属性(int,string,...)但不能传递Dictionary。有没有机会实现这一目标?因为这本词典有29对,它们似乎太多了,无法分开并将它们分开。
答案 0 :(得分:3)
您可以使用隐藏字段和编辑器模板。我们来举个例子:
型号:
public class MyViewModel
{
public IDictionary<string, string> BookVars { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
// fill the dictionary with some dummy data
BookVars = Enumerable
.Range(1, 5)
.ToDictionary(x => "key" + x, x => "value" + x)
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
// the model.BookVars property will be properly bound here
return View(model);
}
}
查看(~/Views/Home/Index.cshtml
):
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.BookVars)
<button type="submit">OK</button>
}
编辑模板(〜/ Views / Home / EditorTemplates / KeyValuePair`2.cshtml):
@model KeyValuePair<string, string>
@Html.Hidden("Key", Model.Key)
@Html.Hidden("Value", Model.Value)
注意编辑器模板的名称,它将自动为字典的每个元素呈现:KeyValuePair`2.cshtml
很抱歉,我无法使用SO的编辑器对其进行正确格式化,但该文件的名称应为:KeyValuePair[grave accent]2.cshtml
其中[grave accent]
为grave accent character。
另外,请不要忘记阅读有关集合和字典的wire format,默认模型绑定器希望能够更好地了解正在发生的事情。
答案 1 :(得分:3)
序列化你的字典并将其作为字符串传递(可能是base64编码)。
答案 2 :(得分:2)
不,您不能将对象作为参数传递。唯一的方法是在数据库中存储对象,并传递该对象的POST only id。您应该创建包含该词典的模型:
public int id {get;set;}
public Dictionary<string, int> Dictionary {get;set};
并从服务器端通过id加载它。
答案 3 :(得分:0)
您可以使用例如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活页夹。
你已经完成了。