ASP.NET MVC,从视图传递模型到控制器

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 => otherstuff”。我得出结论,"otherstuff"应该是我想要将数据写入的字段,在这种情况下可能是“p.value”。但箭头前面的“stuff”是什么?
在控制器中,我有一个用于POST的函数,并进行了一些调试:
[HttpPost]
public ActionResult Input(InputModel m) {
  DEBUG(m.ToJson());
  DEBUG("COUNT: " + m.axProc.Count);

  return View(m);
}

这里的调试信息只显示类似于:

{"axProc":[]}
COUNT: 0

所以我得到的Model是空的。
问题2:@using(Html.BeginForm())这个用法有基本错误吗?如果不是正确的选择,那么我如何将填充了数据的Model返回给控制器?(因为上面的示例已经缩写,实际代码中会有更多内容,所以我不能在此处使用"@model List< Process >"。)
希望有人能补充一些我忽略的细节。

1
你需要学习什么是Lambda表达式。 - SLaks
我已经做了,谢谢你提供的名字。 - Cabadath
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" />
}

1
谢谢,那个很好用。我还遇到了一个额外的问题,就是如果有更多的层次,你必须将它们定义为属性(使用 {get;set;} 这些东西),而不是字段,否则它就不能按预期工作。 - Cabadath

0
  1. 在 @Html.TextBoxFor(stuff => otherstuff) 中,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()方法是否确实返回了某些内容,例如不是空列表。

loadInputModel()确实会返回一些内容,页面也正确地呈现出来了(如果是空的话就不会这样)。但仅仅将东西放在部分视图中并不能解决问题,请参考tsegay的解决方案。 - Cabadath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接