4

我在使用 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<Process>”(因为上面的例子是缩写的,在实际代码中会有更多的东西)。)

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

4

2 回答 2

2

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

@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" />
}
于 2012-05-30T16:03:55.967 回答
0
  1. 在 @Html.TextBoxFor(stuff => otherstuff) 中,东西是您的视图模型,其他东西是您模型的公共成员。
  2. 由于要在视图中为集合类型 (List) 的模型成员呈现输入元素,因此应首先创建一个单独的局部视图以呈现该集合的单个项目 (Process)。它看起来像这样(例如,将其命名为 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() 方法是否确实返回了某些内容,例如,不是一个空列表。

于 2012-05-30T15:19:19.723 回答