我的MVC BeginForm如何知道要发布哪个网址?

时间:2011-11-06 13:44:10

标签: asp.net-mvc-3

我已经建立了一个我需要重新发布的表单。我已经把...

@using (Html.BeginForm(){
}

但我没有看到使用无参数方法调用的重点,因为我没有看到表单如何知道要发布到哪个URL?我见过一些使用它的例子,他们似乎生成了正确的网址,但我真的不知道为什么我的那个没有?

2 个答案:

答案 0 :(得分:4)

  

但是我没有看到使用无参数方法调用的重点   因为我没看到表单如何知道要发布到哪个URL?

它发布到客户端浏览器当前指向的URL。以下是它的实现方式:

public static MvcForm BeginForm(this HtmlHelper htmlHelper)
{
    string rawUrl = htmlHelper.ViewContext.HttpContext.Request.RawUrl;
    return htmlHelper.FormHelper(rawUrl, FormMethod.Post, new RouteValueDictionary());
}

正如您所看到的,它只是使用与用于呈现表单的URL相同的URL。

关键是在RESTful ASP.NET MVC应用程序中,您通常有2个具有相同名称但可通过不同动词访问的操作:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        MyViewModel model = ...
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        ...            
    }
}

第一个操作用于呈现表单,第二个操作用于处理表单的提交。因此,当您在视图中使用Html.BeginForm而没有任何参数时,第一个操作呈现的不再是对视图中的任何操作或控制器进行硬编码。您依赖于标准的ASP.NET MVC约定。这是正确的方法。

当然,如果你想发布一些不同的动作或控制器,你将不得不使用BeginForm方法的正确重载并指定它们。

答案 1 :(得分:0)

它使用当前请求路由值来确定应将其提交到何处,并依赖于您具有GET控制器操作以向用户和POST控制器呈现响应的约定从用户接收数据的行动。