【问题标题】:Using Html.BeginForm to post to the current controller使用 Html.BeginForm 发布到当前控制器
【发布时间】:2009-06-23 09:08:07
【问题描述】:

我有一个在多个视图中使用的部分。 部分包含表单。提交表单时的操作始终相同,但包含该操作的控制器取决于视图。

假设我有控制器,每个控制器都有一个动作 ActOnChoosenPerson:

消防员控制器

HireStaffController

我有一个部分

PersonList.ascx

表单呈现为

Html.BeginForm("FireStaffController" , "ActOnChoosenPerson") 或

Html.BeginForm("HireStaffController" , "ActOnChoosenPerson")

什么是摆脱控制器参数的好方法?现在我将当前控制器的名称传递给模型并使用

Html.BeginForm(Model.CurrentController , "ActOnChoosenPerson")

但这有点尴尬。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    此代码将始终提供您当前的控制器

    <%=( Url.RequestContext.RouteData.GetRequiredString("Controller")) %>
    

    显然你可以在没有

    Html.BeginForm(
      Url.RequestContext.RouteData.GetRequiredString("Controller")) , 
      "ActOnChoosenPerson") 
    

    它看起来更笨重,但你的模型不需要知道控制器在调用它。

    【讨论】:

    • 在某些情况下,返回值的大小写会因 url 中的内容而异。
    【解决方案2】:

    ViewContext 的RouteData 属性包含当前控制器和动作的名称。你可以像这样使用它们:

    Html.BeginForm("ActOnChoosenPerson", ViewContext.RouteData.
        GetRequiredString("controller"))
    

    【讨论】:

    • 不错,比我快 36 秒。 :)
    • 我更喜欢这种方法,但请注意,控制器和操作参数的顺序错误,并且 RouteDate.Values 索引器返回的对象不是字符串,因此需要强制转换。
    • @fearofawhackplanet:谢谢!我已交换参数并将 Values 属性更改为 GetRequiredString 方法。
    • 尚未对此进行测试,但我怀疑这种方法会尊重子动作控制器,而 @MarkDickinson 则不会
    【解决方案3】:

    最简单的方法是不带参数地调用 BeginForm()。

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多