C# 显式调用FormExtensions.BeginForm解析HttpGet修饰方法,而不是HttpPost
我正在遵循一种模式,我在当前项目中使用过很多次,但是对于我最近编写的视图,BeginForm()正在为我的操作方法而不是POST解析GET路径。我不知道我做了什么不同的事,所以我真的很困惑。示例代码如下:C# 显式调用FormExtensions.BeginForm解析HttpGet修饰方法,而不是HttpPost,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我正在遵循一种模式,我在当前项目中使用过很多次,但是对于我最近编写的视图,BeginForm()正在为我的操作方法而不是POST解析GET路径。我不知道我做了什么不同的事,所以我真的很困惑。示例代码如下: public class FooController:Controller { [HttpGet] public ActionResult Bar(int id) { return View(new Model(id)); } [HttpPost] public
public class FooController:Controller {
[HttpGet]
public ActionResult Bar(int id) {
return View(new Model(id));
}
[HttpPost]
public ActionResult Bar(Model model) {
//do stuff with the model
}
}
//Bar View
<script type="text/javascript">
$(document).ready(function() {
$('#formName').submit(function() {
if(/* invalid input */) {
//set html for an error div
return false;
}
});
});
</script>
@model Model
@using(Html.BeginForm("Bar", //action name
"Foo", //controller name
null, //explicit null for route values
FormMethod.Post //explicitly set form method
new {id="formName"})){ //explicitly id the form
//bunch of inputs, a la
@Html.TextBox("Property", Model.Property)
}
//Bar html
<form id="formName" action="/Foo/Bar/{Model Id}" method="post">
<!-- input elements, etc -->
</form>
公共类控制器:控制器{
[HttpGet]
公共操作结果栏(int id){
返回视图(新模型(id));
}
[HttpPost]
公共行动结果栏(模型){
//用模型做些什么
}
}
//条形图
$(文档).ready(函数(){
$('#formName')。提交(函数(){
如果(/*无效输入*/){
//为错误div设置html
返回false;
}
});
});
@模型
@使用(Html.BeginForm(“Bar”),//操作名称
“Foo”,//控制器名称
null,//路由值的显式null
Post//显式设置表单方法
新的{id=“formName”}){//显式标识表单
//一堆输入,一个la
@文本框(“属性”,Model.Property)
}
//条形html
我尝试过的BeginForm的每一个重载都会使用操作后的Id解析路由,因此每次表单发布到GET方法时
我尝试将POST方法重命名为,例如“BarBar”,并更新对BeginForm的调用——在这种情况下,路由正确解析,表单发布到适当的操作
我在其他几十种表单中都遵循了这种模式——有人知道我这次可能做错了什么吗?对于输入,您使用的是Html.TextBoxFOR、Html.DropDownListFOR等,而不仅仅是Html.TextBox吗?只是跳出框来思考,但是如果您使用以下内容,会发生什么。您的两个操作都没有明确采用零参数,因此我想知道路由引擎是否很难选择“正确”的路径:
这个看起来不错。图片中可能还有其他内容,或者这不是您的实际代码。我在@BeginForm区域前面有一个用于输入验证的块。我将更新示例以反映这一点。不,只需调用@Html.TextBox(“Name”,Model.Name)就可以了,所以请尝试Html.TextBoxFor(m=>m.Name)这应该将其绑定到模型的Name属性。模型绑定没有问题。当我给它一个不同的名称时,POST操作工作得很好-模型用所有正确的值初始化。这里的问题是BeginForm为action方法构造了错误的路由。是的,我同意当您显式使用FormMethod时,选择用[HttpPost]修饰的操作应该“足够聪明”。调用BeginForm.new{model=null}会导致语法错误;显然,您不能将“null”分配给匿名属性。
@using(Html.BeginForm("Bar",
"Foo",
new {model = null},
FormMethod.Post,
new {id="formName"}))