【问题标题】:Accepting params or raw data in controller?在控制器中接受参数或原始数据?
【发布时间】:2012-02-14 17:20:24
【问题描述】:

我想知道是否可以在控制器函数中使用“params”参数,或者类似的东西可以让我在表单中处理 X 数量的条目。

例如,我有一个表单,其中包含 X 数量的“名称”元素,这些元素是通过 jQuery 自动生成的。这些名称元素的示例如下:

<input type="text" name="studentName1"></input>
<input type="text" name="studentName2"></input>
<input type="text" name="studentName3"></input>

现在,每次都有不同数量的学生姓名,所以这让我在控制器中处理表单数据变得相当复杂。我想到了以下 2 个示例,但它们在现实中当然行不通。

[HttpPost]
public ActionResult PostStudentNames(params string[] studentNames)

或者:

[HttpPost]
public ActionResult PostStudentNames(string[] formValues)

我能达到类似的效果吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    我只是想用一种不同的方法来解决这个问题。如果更方便,您可以将模型直接绑定到原始或复杂类型的集合。这里有 2 个例子:

    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" />
    }
    

    学生.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&lt;Student&gt;。通过使用这种方法,您可以让默认模型绑定器为您完成一些繁琐的工作。

    更新评论

    是的,你也可以这样做:

    表格:

    @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
    }
    

    【讨论】:

    • 我可以将它与我称为“int ClassId”的附加参数结合起来,它也来自表单?
    • @MathiasLykkegaardLorenzen 是的,更新了答案以显示示例。顺便说一句,如果您想知道如何将显示模板与该数据一起使用,Phil Haack 涵盖了整个事情here
    • @MathiasLykkegaardLorenzen 你能举个例子说明你的意思吗?
    • 没关系,我把那部分修好了。现在我面临一个不同的问题。我的学生有一个双倍的“点”值。但是,当我启动表单时,由于服务器的本地化设置,它不起作用。它需要一个“,”小数分隔符而不是“。”小数分隔符。我在这里做什么?
    • @MathiasLykkegaardLorenzen 这是一个单独但常见的问题。查看 Phil Haack 的 post 关于该主题的内容以及 this question 的另一个观点。
    【解决方案2】:

    马蒂亚斯,

    这在不依赖 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
    }
    

    等等...至少,这是我对最近一个项目的回忆。 :)

    【讨论】:

    • 是的 - 这些天我几乎每次必须打开一个 webforms 项目进行维护时都会“作呕”。 mvc 就是这么“正确”(无论如何对我来说——我知道这是品味和风格的问题)
    • 如果 studentName 输入的值为 ',' 会发生什么
    • Yorga - 是的,在我制作的原始示例中,这可能会发生。检查狡猾的逗号当然是一个有先见之明的目标。很好 - 当然可以使用var valueStudents = formValues["studentName"].Split(',').Where(x =&gt; x.Length&gt;0).ToArray();。将更新答案
    【解决方案3】:
    <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)
    {
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2021-06-16
      • 2016-03-26
      • 2018-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多