我正在使用asp-mvc应用程序并面临以下问题: 我有一个具有简单属性的模型加上一个属性,它是我的自定义对象的列表,我呈现如下所述的Ienumerable属性: Passing IEnumerable property of model to controller post action- ASP MVC
在我看来,我有一个按钮,应该将项目添加到我的模型的ienumerable属性中。当然,我不想丢失已插入的数据,因此我需要将模型传递给相应的操作。
我注意到模型os完全只在帖子上传输。所以,我做了类似的事情:
$(".addButton").click(function (event) {
event.preventDefault();
$("#FilterForm").submit();
@{ Session["fromAddFullItem"] = "true";}
return false;
});
然后在我的控制器中,我做了类似的事情:
public ActionResult Index(FilterModel model)
{
if (Session["fromAddFullItem"].ToString() == "true")
{
Session["fromAddFullItem"] = "false";
return AddBlankItemTemplate(model);
}
我已经知道不建议在js中分配会话,但也尝试过TempData,并且数据始终为空。
我的问题是Session [" fromAddFullItem"]总是正确的,即使我来自另一个按钮。如果我在addbtn中放置断点,请单击“会话”[" fromAddFullItem"] =" false";,然后按另一个按钮,我看到由于某些奇怪的原因,所提到的断点被击中即使我没有按下添加按钮。
有任何帮助吗?也许有另一种方法来实现我想要的。目前,无论我按哪个按钮(发布表格),它都会作为Session [" fromAddFullItem"] =" false"并采取行动AddBlankItemTemplate。感谢。
编辑 - AJAX POST
$(".addButton").click(function(event) {
event.preventDefault();
var modelData = JSON.stringify(window.Model);
$.ajax({
url: '@Url.Action("AddBlankItemTemplate")',
type: 'POST',
dataType: 'json',
data: modelData,
contentType: 'application/json; charset=utf-8',
});
return false;
});
和控制器
public ActionResult AddBlankItemTemplate(string modelData)
编辑2:
$(".addButton").click(function (event) {
event.preventDefault();
$.ajax({
url: '@Url.Action("AddBlankItemTemplate")',
data: $("#FilterForm").serialize()
}).success(function(partialView) {
$('DetailsTemplates').append(partialView);
});
});
和控制器:
public ActionResult AddBlankItemTemplate(FilterModel model)
答案 0 :(得分:2)
第@{ Session["fromAddFullItem"] = "true";}
行是Razor代码,无论您将其放在页面的哪个位置,都会在页面呈现和加载时运行。
这不是客户端代码,所以不会等待你的js代码运行。如果你试图在js和MVC之间同步状态,你可以查看angularjs,它可以简化这些操作。