不要陷入抽象的泥沼,从渲染页面到调用控制器方法,您仅在 HTML 和 HTTP 中工作。
如果您想使用不同的方法发回,有多种方法可以实现。您的页面上可以有多个 HTML 表单,也可以使用 jQuery 之类的东西来执行发布。哪个控制器操作接收您的帖子以及发回哪些数据由 HTML 页面上的表单及其内容决定。 MVC 处理程序将获取请求,并尝试将请求 URL 和内容绑定到与其匹配的可用操作之一。
要“回发模型”,您需要将数据发送回合适的操作,以便模型绑定程序可以读取它。这可以是 JSON 数据(如果您使用的是 MVC 3)或具有名称/值对的表单。但控制器对请求数据的页面及其创建方式一无所知。它甚至不知道请求是否是由页面发出的。
您可以自己尝试一下,制作一个普通的 HTML 页面,其中包含一个表单,该页面被设置为发布到您的 MVC 控制器之一的 URL。只要表单字段的名称与控制器操作参数上的属性名称匹配,MVC 就会绑定它并调用该操作。
如果您有复杂的视图,您可能会发现 jQuery post 是不错的选择,其中有一些客户端方法可以从页面收集数据并创建 JSON 对象以发回。使用该方法可以非常精确地控制发回的数据,而使用表单则有限制(例如重叠数据等)。
编辑-回复评论
下面是一个使用原始 HTML 的示例,仅用于展示一个非常简单的情况:
Public Class HomeController
'Other action methods...
<HttpPost()>
Function SayHello(myName As String) As ActionResult
Return Content("Hello " & myName)
End Function
End Class
HTML 表单(我把它放在索引视图上,但它绝对可以放在任何地方)
<form action="/Home/SayHello" method="post">
<input type="text" name="myName" />
<input type="submit" />
</form>
我已将名称设置为<input>
来匹配参数名称,这给MVC提供了帮助。虽然只有 1 个值被发回,但我可以将其命名为其他名称。但是如果我这样做:
<form action="/Home/SayHello" method="post">
<input type="text" name="aName" />
<input type="text" name="anotherName" />
<input type="submit" />
</form>
...那么模型绑定器将不知道应该使用哪个值,并且您会得到未正确设置的值。
不过改成这样:
<form action="/Home/SayHello" method="post">
<input type="text" name="myName" />
<input type="text" name="anotherName" />
<input type="submit" />
</form>
...模型绑定器现在能够使用名称来正确识别要使用的值和要忽略的值。
对于强类型操作:
Public Class HomeController
<HttpPost()>
Function SayHello(person As SimplePerson) As ActionResult
Return Content("Hello " & person.FirstName)
End Function
End Class
Public Class SimplePerson
Public Property FirstName As String
Public Property Surname As String
End Class
您需要具有与属性名称相对应的表单名称。我的 aName/anotherName 表单会发回正确的形状,但模型绑定器不会设置任何属性,因为它不知道什么是什么。然而,这会起作用:
<form action="/Home/SayHello" method="post">
<input type="text" name="FirstName" />
<input type="text" name="Surname" />
<input type="submit" />
</form>