【问题标题】:Asp.net MVC Form Post to Action with missing parameter initialization缺少参数初始化的 Asp.net MVC 表单发布到操作
【发布时间】:2012-03-08 23:54:39
【问题描述】:

我在将 ASP.net MVC 表单发布到包含多个参数的操作时遇到问题。问题只是部分参数正在初始化。

页面有多个表单,每个表单都由一个单独的控制器支持。

接收 Post 动作的控制器动作如下所示

public ActionResult Create(int institutionId, int applicationId, [Bind(Prefix = "LogoutItem")]LogoutItemDetail logoutItemDetail)

表格如下所示:

<% using (Html.BeginForm<LogoutItemsController>( c => c.Create(0,0,null))) { %>
  <%= Html.AntiForgeryToken() %>
  <tr>
    <td><%= Html.SubmitButton("btnAdd", "Add") %></td>
    <td><%= Html.TextBox("LogoutItem.Path")%></td>
  </tr>
<% } %>

编辑 表单操作网址

/Applications/LogoutItems/Create/0/0

我已经用 MVC Route Debugger 和 VS Debugger 验证了这个 url 与下面的路由匹配。

还有路线

routes.MapRoute(null, "Applications/{controller}/{action}/{institutionId}/{applicationId}/")

当前网址

Applications/Show?institutionId=1001&applicationId=3003

当我逐步执行 Create 方法时,

  • institutionId 的值为 1001
  • applicationId 的值为 0,并且
  • logoutItemDetail 有表单提交的值

关于为什么 applicationId 参数似乎没有被初始化的任何想法?

编辑

做了一点测试,我发现如果我没有在表单中明确命名控制器/动作

<% using (Html.BeginForm()) { %>

页面中的每个表单都已发布,并且所有正确的参数值。在这种情况下,表单操作值是一个空字符串。如果页面上的每个表单都没有发布,这将是一个可接受的解决方案。

【问题讨论】:

    标签: c# asp.net-mvc forms model-binding


    【解决方案1】:

    根据您提供的信息,一种可能性是您在global.asax 文件中的默认路由之后添加了自定义路由。当您定义新路线时,您需要先添加最具体的路线,然后再向下处理更一般的路线,类似于筛子。如果是这种情况,只需将您的自定义路由移到代码中更高的位置,以便将其列在默认路由之前。您的 LogoutItemDetail 实例绑定成功的原因是您明确声明了绑定。

    更多代码有助于做出更准确的评估,但根据您分享的内容,这是我的最佳猜测...

    【讨论】:

    • 附加路由添加在默认路由之前。还有其他我可以提供的信息,您认为对您有帮助吗?
    【解决方案2】:

    如果您导航到 /Applications/Show/1001/3003 会发生什么

    ???

    如果您将 applicadionId 的名称更改为其他名称会发生​​什么?可能是保留字?

    【讨论】:

    • URL /Applications/Show/1001/3003 返回 404 错误。我不确定为什么这个 URL 不起作用,我希望 URL 没有查询参数,但这对我来说不是一个大问题。至于第二个建议,我将 applicationId 更改为 appId ,结果相同。
    【解决方案3】:

    我同意 Neil T 的观点。可能会先选择另一条路线。如果您能告诉我们所有其他映射路线,那会有所帮助(或者只是注释掉所有其他要测试的路线)。

    事实上,我认为 JDPeckham 的调试在正确的轨道上,因为您描述的路由映射没有默认 {action} 参数,所以我想知道您的测试 url 是如何映射到 Create 方法的。所以尝试导航到 /Applications/Show/Create/1001/3003。如果该 url 有效,那么我肯定会说它是路由条目。

    【讨论】:

    • 唯一的其他路由条目是默认根:routes.MapRoute(null, "{controller}/{action}", new { controller = "Home", action = "Index" }), routes.MapRoute(null, "{controller}/{action}/{id}") 您建议的 URL 会导致 404 错误。我已经编辑了我的帖子以显示有效的表单操作。
    • 好吧,我误解了你所说的“当前 URL”是什么意思。对于您的更新,我看不到如何发布页面上的每个表单。我假设每个表单都有多个&lt;% using (Html.BeginForm()) { %&gt;,对吗?此外,定义“创建”操作的类(即控制器)是什么?我没有使用 BeginForm 方法的通用版本(我相信它来自 futures.dll),所以它可能存在错误。您可以尝试使用非通用版本,以便您使用:&lt;% using (Html.BeginForm("Create", new {controller=...,institutionId=...,..)) { %&gt;
    【解决方案4】:
    I've had something like that , 
    found the solution as ; 
    
    you can write static 
    
    ## <form action="/Video/VideoComment" ....  ## but 
    you dont use For<> ; for example ; 
    
    in using blog to use ;
    ## @using (Html.BeginForm(  ##
    ## @Html.DropDownListFor  ##
    
    
    in statict ##  < form   ##  to use ; 
    ## @Html.DropDownList  ## 
    

    此答案仅用于部分观点:) 像这样:[链接]

    nice development :)) 
    
    sory my english :(( 
    

    【讨论】:

      猜你喜欢
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 2018-09-19
      • 1970-01-01
      • 2019-01-26
      相关资源
      最近更新 更多