【问题标题】:ASP.NET MVC, passing Model from View to ControllerASP.NET MVC,将模型从视图传递到控制器
【发布时间】:2012-05-30 13:30:39
【问题描述】:

我在使用 ASP.NET MVC 并将数据从视图传递到控制器时遇到问题。我有一个这样的模型:

 public class InputModel {
   public List<Process> axProc { get; set; }

   public string ToJson() {
     return new JavaScriptSerializer().Serialize(this);
   }
 }

 public class Process {
   public string name { get; set; }
   public string value { get; set; }
 }

我在我的控制器中创建这个 InputModel 并将它传递给视图:

public ActionResult Input() {
  if (Session["InputModel"] == null)
    Session["InputModel"] = loadInputModel();
  return View(Session["InputModel"]);
}

在我的 Input.cshtml 文件中,我有一些代码来生成输入表单:

@model PROJ.Models.InputModel

@using(Html.BeginForm()) {
  foreach(PROJ.Models.Process p in Model.axProc){
    <input type="text" />
    @* @Html.TextBoxFor(?? => p.value) *@
  }
  <input type="submit" value="SEND" />
}

现在,当我单击提交按钮时,我想处理放入文本字​​段中的数据。

问题 1: 我见过这个@Html.TextBoxFor(),但我并没有真正理解这个“stuff => others”。我得出的结论是,“其他东西”应该是我想要写入数据的字段,在这种情况下,它可能是“p.value”。但是箭头前面的“东西”是什么?

回到控制器,然后我有一个带有一些调试的 POST 功能:

[HttpPost]
public ActionResult Input(InputModel m) {
  DEBUG(m.ToJson());
  DEBUG("COUNT: " + m.axProc.Count);

  return View(m);
}

这里的调试只显示如下内容:

{"axProc":[]}
COUNT: 0

所以我得到的返回模型是空的。

问题 2: 我在使用 @using(Html.BeginForm()) 时做错了什么?这不是正确的选择吗?如果是这样,我如何让我的模型充满数据回到控制器?
(这里不能使用“@model List”(因为上面的例子是缩略的,实际代码中会有更多的东西)。)

我希望有人可以填写我忽略的一些细节。

【问题讨论】:

  • 你需要了解什么是 lambda 表达式。
  • 我做到了,现在。谢谢你的名字。

标签: asp.net-mvc controller ienumerable html.beginform


【解决方案1】:

将您的视图更改为类似这样的内容,以便在表单提交时正确绑定列表。

@using(Html.BeginForm()) {
  for(int i=0;i<Model.axProc.Count;i++){
   <span>
    @Html.TextBoxFor(model => model.axProc[i].value)
</span>
  }
  <input type="submit" value="SEND" />
}

【讨论】:

  • 谢谢,效果很好。我遇到的另一个问题是更多层,您必须将它们定义为属性(使用 {get;set;} 东西),而不是字段,否则它不会按预期工作。
【解决方案2】:
  1. 在@Html.TextBoxFor(stuff => otherstuff) 中,东西是您的视图模型,其他东西是您模型的公共成员。
  2. 由于您希望在视图中为集合类型(List)的模型成员呈现输入元素,因此您应该首先创建一个单独的局部视图来呈现该集合的单个项目(进程)。它看起来像这样(例如,将其命名为 Process.cshtml,然后放入 /Views/Shared 文件夹):

    @model List<PROJ.Models.Process>
    
    @Html.TextBoxFor(model => p.value)
    

然后,您的主视图将如下所示:

@model PROJ.Models.InputModel

@using(Html.BeginForm()) {
  foreach(PROJ.Models.Process p in Model.axProc){
    @Html.Partial("Process", p)
  }
  <input type="submit" value="SEND" />
}

另外,检查 loadInputModel() 方法是否真的返回了一些东西,例如不是空列表。

【讨论】:

  • loadInputModel() 确实返回了一些东西,页面被正确呈现(如果它是空的则不会出现这种情况)。但只是将这些东西放在局部视图中并不能解决问题,请参阅 tsegay 的解决方案。
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多