控制器方法:通过POST与签名传递值

时间:2010-08-27 20:31:48

标签: asp.net-mvc

//method declaration
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Step2_UpdateCart(bool? isNextStepClicked)

//one of many of the view's fields processed by the method
<input type="hidden" name="isNextStepClicked" value="false" />

我正在对一个视图/控制器集进行逆向工程,其中视图中的表单具有一系列通过提交传递的输入。其中一个输入是隐藏字段 - 它的名称在方法的签名中找到 - 并且是签名中唯一的值 - 其余值来自Request对象。

我想也许这可能是一种情况,该方法可以递归调用自己的值不同于所携带的形式,但我不认为这发生在任何地方。

这有什么意义吗? (无论是我的问题还是我的代码示例)。

很多人

2 个答案:

答案 0 :(得分:1)

您可能会发现利用输入模型或FormCollection类型更好。使用第一个选项,您可以定义属性,MVC的默认模型绑定器将尽力映射它们。 E.g:

public ActionResult Step2_UpdateCart(UpdateCartInputModel model)

UpdateCartInputModel可以定义为:

public class UpdateCartInputModel {
    public bool? isNextStepClicked { get; set; }
    public bool? isSomeOtherPropertyClicked { get; set; }
}

使用FormCollection,MVC会将此视为一种特殊情况,如果某个操作接受FormCollection的实例,则会将其填充:

public ActionResult Step2_UpdateCart(FormCollection form)

使用FormCollection,您必须自己处理类型转换/转换。

我个人认为没有必要尝试构建一些复杂的递归控制器动作,当您需要完成以上任何一项时,您可以完成。

答案 1 :(得分:0)

我想你在问“参数来自哪里?”而参数我的意思是布尔? isNextStepClicked签名参数。根据我的知识,有三种方法可以调用Controller ActionResult。

第一个是使用RedirectToAction从另一个Action直接调用。接下来是上面列出的 - 从表单中,声明控件与您的命名参数具有相同的ID(例如,提供公共ActionResult ViewName的签名(字符串信息)。我个人觉得这很烦人,因为我喜欢拥有我的所有具有正确类型的外壳的代码 - 但由于大多数表单ID以大写字母开头,因此我的签名参数也是如此。

第三,有直接的构造函数调用。这是最糟糕的,因为没有办法跟踪使用Shift + F12从标记中调用它(查找所有用法)。某些参数可以命名但不能调用。控制器不需要每个参数的值。

希望这会对你有所帮助。 :-)