我想知道是否可能在控制器函数中使用“params”参数,或类似的东西,这样我就可以在表单中处理X条目数。
例如,我有一个具有X量“name”元素的表单,这些元素是通过jQuery自动生成的。这些名称元素的示例如下:
<input type="text" name="studentName1"></input>
<input type="text" name="studentName2"></input>
<input type="text" name="studentName3"></input>
现在,每次都有不同数量的学生姓名,所以这使我在控制器中处理表单数据变得非常复杂。我想到了以下两个例子,但当然它们在现实中不起作用。
[HttpPost]
public ActionResult PostStudentNames(params string[] studentNames)
或者:
[HttpPost]
public ActionResult PostStudentNames(string[] formValues)
我可以取得类似的东西吗?
答案 0 :(得分:4)
我只想用一种可以用于此的不同方法。如果它更方便,您可以直接将绑定模型建立为原始或复杂类型的集合。这是两个例子:
index.cshtml:
@using (Html.BeginForm("ListStrings", "Home"))
{
<p>Bind a collection of strings:</p>
<input type="text" name="[0]" value="The quick" /><br />
<input type="text" name="[1]" value="brown fox" /><br />
<input type="text" name="[2]" value="jumped over" /><br />
<input type="text" name="[3]" value="the donkey" /><br />
<input type="submit" value="List" />
}
@using (Html.BeginForm("ListComplexModel", "Home"))
{
<p>Bind a collection of complex models:</p>
<input type="text" name="[0].Id" value="1" /><br />
<input type="text" name="[0].Name" value="Bob" /><br />
<input type="text" name="[1].Id" value="2" /><br />
<input type="text" name="[1].Name" value="Jane" /><br />
<input type="submit" value="List" />
}
Student.cs:
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
HomeController.cs:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult ListStrings(List<string> items)
{
return View(items);
}
public ActionResult ListComplexModel(List<Student> items)
{
return View(items);
}
}
ListStrings.cshtml:
@foreach (var item in Model)
{
<p>@item</p>
}
ListComplexModel.cshtml:
@foreach (var item in Model)
{
<p>@item.Id. @item.Name</p>
}
第一个表单只是绑定一个字符串列表。第二个,将表单数据绑定到List<Student>
。通过使用这种方法,您可以让默认模型绑定器为您完成一些繁琐的工作。
是的,你也可以这样做:
形式:
@using (Html.BeginForm("ListComplexModel", "Home"))
{
<p>Bind a collection of complex models:</p>
<input type="text" name="[0].Id" value="1" /><br />
<input type="text" name="[0].Name" value="Bob" /><br />
<input type="text" name="[1].Id" value="2" /><br />
<input type="text" name="[1].Name" value="Jane" /><br />
<input type="text" name="ClassId" value="13" /><br />
<input type="submit" value="List" />
}
控制器操作:
public ActionResult ListComplexModel(List<Student> items, int ClassId)
{
// do stuff
}
答案 1 :(得分:3)
的Mathias,
这无法使用params对象,效果非常好。你的表单控件:
<input type="text" name="studentName" />
<input type="text" name="studentName" />
<input type="text" name="studentName" />
<input type="text" name="professorName" />
您将使用FormCollection对象,该对象将包含所有表单元素作为逗号分隔列表(如果是控件数组)或单个属性。在上面的例子中,这是我们得到的:
[HttpPost]
public ActionResult PostStudentNames(FormCollection formValues)
{
// basic check for rogue commas inside input controls
// would need far more sophistication in a #real# app :)
var valueStudents = formValues["studentName"].Split(',')
.Where(x => x.Length > 0).ToArray();
var valueProfessor = formValues["professorName"];
// other stuff
}
等......至少,这是我对最近一个项目的回忆。 :)
答案 2 :(得分:1)
<input type="text" name="studentName[0]"></input>
<input type="text" name="studentName[1]"></input>
<input type="text" name="studentName[2]"></input>
public ActionResult PostStudentNames(string[] studentName)
{
}