将js复杂数组传给mvc控制器,然后返回另一个视图
Posted
技术标签:
【中文标题】将js复杂数组传给mvc控制器,然后返回另一个视图【英文标题】:Pass js complex array to mvc controller, and then return another view 【发布时间】:2018-05-03 21:25:38 【问题描述】:这和我之前的question有关。 我想知道,即使现在我试图发送一个更复杂的数组,我能否以相同的方式传递一个 JS 数组(与上一个问题中接受的答案一样):
如果是,那么如何?在控制器中接收时获取空值。 这是我的模型:
public class QuestionModel
public bool Choice get; set;
public List<object> ChoiceQuestions get; set; //can i use List<object>?
public int Id get; set;
public string Question get; set;
public bool Short get; set;
public object ShortQuestion get; set; //here aswell - can I use object?
public string Type get; set;
甚至不确定我是否可以重用 js 代码将数据发送到答案中给出的控制器。如果不是,那我应该如何解决这个问题?我仍然必须能够通过 post 将数据发送到控制器,然后在处理数据后将其返回给视图。
【问题讨论】:
你是怎么寄的?您可以通过 ajax 发布一个复杂的对象,并且您的操作方法的响应(可能是视图结果)将返回到 ajax 调用的成功处理程序。如果你想导航到不同的页面,ajax 在这里可能不是正确的解决方案。做一个普通形式的帖子。 如果是object
,您(或 MVC 绑定器)无法设置任何属性。也许dynamic
有效,或者为这些问题创建一个真实的课程。
您是将其作为普通提交还是使用 ajax 发布。如果正常提交,则不能使用数组。您必须对集合索引器使用正确的名称,例如,如果 POST 方法是 List<QuestionModel>
,那么您将需要 [0].Choice: true
、[0].ChoiceQuestions[0].Id: 0
等
如果您想要进行正常的提交和重定向,则不清楚为什么要构建一个 javascript 对象数组 - 您不需要这样做,或者根本不需要任何 javascript)如果您已经生成了您的视图一开始就正确
如果您生成了正确的视图,那么可以正常提交。例如,请参阅this answer,了解如何为作为集合的模型(或包含作为集合的属性的模型)生成表单控件。或者,如果您在视图中动态添加集合项,请参阅 this answer
【参考方案1】:
您可以将任何对象的 Json 设置为单个隐藏表单字段,然后使用字符串参数发布表单以执行操作。然后在服务器端将 json 消毒到 action 方法内的对象 - 即使在另一个控制器中。您可以从控制器方法返回不同的视图。
Javascript(在股票页面/视图上说)
var form = document.createElement("form");
var input = document.createElement("input");
input.setAttribute("type", "hidden") ;
input.setAttribute("name", "outwardStocks") ;
input.setAttribute("value", JSON.stringify(selectedrecords));
form.appendChild(input);
document.body.appendChild(form);
form.action = "/CRM/Invoice/Index";
form.method = "post"
form.submit();
控制器代码(说发票控制器)
[HttpPost]
public IActionResult Index(string outwardStocks)
InvoiceItems invItems = JsonSerializer.Deserialize<InvoiceItems>(outwardStocks);
......
return View("Invoice" InvoiceVM);
【讨论】:
以上是关于将js复杂数组传给mvc控制器,然后返回另一个视图的主要内容,如果未能解决你的问题,请参考以下文章
如何将消息从我的存储库类返回到我的控制器,然后返回到我在 asp.net-mvc 中的视图?