2012-05-30 212 views
4

我在ASP.NET MVC中遇到麻烦,并将数据从View传递到Controller。我有这样一个模型: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”。我的结论是,“其他人”应该是我想要写入数据的领域,在这种情况下,它可能是“p.value”。但是箭头前面的“东西”是什么?

早在控制器然后我有一些调试的自检功能:

[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名单<过程>”在这里(因为上面的例子中的简称,在实际的代码将有更多的东西)。)

我希望有人能填补我在与一些我忽略的细节。

+1

您需要了解什么是lambda表达式。 – SLaks

+0

我现在做过。感谢您的名字。 – Cabadath

回答

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. In @ Html.TextBoxFor(stuff => otherstuff)stuff是你的View的模型,otherstuff是你模型的公共成员。
  2. 由于在View中想要为集合类型(List)的模型成员呈现输入元素,因此应首先为呈现该集合的单个项目(Process)创建单独的局部视图。它会是这个样子(命名为Process.cshtml,例如,并将其放置到/查看/共享文件夹):

    @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()方法是否实际返回某些内容,例如不是一个空的列表。

+0

loadInputModel()确实返回了一些东西,页面被正确渲染(如果它是空的,情况不会如此)。但只是将这些东西放在部分视图中并不能解决问题,请参阅tsegay的解决方案。 – Cabadath

相关问题