【问题标题】:MVC Controller parameter for a form element with a dot in it?带有点的表单元素的 MVC 控制器参数?
【发布时间】:2011-04-20 13:33:20
【问题描述】:

如果您使用Html.TextBoxFor() 类型的方法,您可能会得到名称中带有点的表单控件,如下所示:

<input type="text" name="Contact.FirstName" id="Contact_FirstName" />

如果您希望 MVC 将这些命名字段映射到控制器中的参数(而不是对象参数或其他),您必须正确获取参数名称。如何处理这些点?

这都不是:

[HttpPost]
public ActionResult FooAction(string firstName)

不是这个:

[HttpPost]
public ActionResult FooAction(string contact_FirstName)

似乎有效。

编辑:有一个合适的对象参数会起作用(例如see clicktricity's answer),但我正在寻找一种使用命名值参数的方法。

【问题讨论】:

    标签: asp.net-mvc post


    【解决方案1】:

    我找到了另一种方法,一种 hack,因为我认为这是滥用 BindAttribute,将 firstName 参数与 Contact.FirstName 输入元素相关联:

    [HttpPost]
    public ActionResult FooAction([Bind(Prefix="Contact.FirstName")]string firstName)
    

    这肯定适用于 ASP.NET MVC 1。

    【讨论】:

    • 嘿,这很有趣。为什么称其为滥用?这不就是 BindAttribute 的用途吗?
    • 似乎 BindAttribute.Prefix 属性仅用于为复杂类型的实例提供别名。
    • 它也适用于 MVC 2。我称之为“创意”而不是 hack。
    【解决方案2】:

    根据其他表单控件,您应该能够让 MVC 默认模型绑定器为您构造一个 Contact 对象。那么您的操作方法的签名将是:

    [HttpPost]
    public ActionResult FooAction(Contact contact)
    

    然后将正确绑定 Contact.FirstName(和任何其他文件)

    【讨论】:

    • 谢谢,是的,这会起作用,但我很感兴趣字符串参数方法是否也能起作用。
    • 很遗憾没有。当您不想遵循约定时,这是“约定优于配置”的问题之一。如果您需要绑定到单个值,请编写自定义模型绑定器,或从 Forms 集合中获取值
    • 啊,好的。所以它不可能使用字符串参数。谢谢
    • 原来有一种方法可以做到这一点,使用 BindAttribute,请参阅 Alex P 的答案。
    【解决方案3】:

    正如 Clicktricity 在 cmets 中建议的那样,您可以使用

    [HttpPost]
    public ActionResult FooAction(FormCollection form)
    {
        firstName = form["Contact.FirstName"];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多