2010-12-14 81 views
3

嗨,我正在使用多个开始表单。我不确定这是否是一个好主意。这是我的代码。ASP.NET MVC多重开始形式?

<% using (Html.BeginForm("TagManagement", "InternalTag",FormMethod.Post)) 
    {%> 
    <%: Html.AntiForgeryToken() %> 

    <table>   
     <tr> 
      <td><%:Html.Label("Type") %></td> 
      <td style="text-align:left"><%:Html.DropDownList("ObjectType",ViewData["TagObjects"] as IEnumerable<SelectListItem>)%></td> 
     </tr> 
     <tr> 
      <td><%:Html.Label("Search ID")%></td> 
      <td style="text-align:left"><%:Html.TextBox("ObjectID2")%></td> 
     </tr> 
     <tr> 
      <td></td> 
      <td><input id="Search" type="submit" value="Search" />&nbsp;&nbsp;&nbsp;<input id="Create" type="button" value="Add to New Tag" onclick="AddTagElements()" /></td> 
     </tr> 
    </table> 
    <br /> 

<% } %> 

<% using (Html.BeginForm("CreateTag","InternalTag",FormMethod.Post)) { %> 
<%: Html.AntiForgeryToken() %> 
<div id="AddTag"> 
     <input id='SaveTag' type='submit' value='Save' style='width: 125px' /> 
</div> 
<% } %> 

路由代码

"Tags/{controller}/{action}/{id}/{type}", 
new { action = "Index", id = UrlParameter.Optional, type = UrlParameter.Optional } 

我的控制器方法:

public ActionResult TagManagement(FormCollection FC,Guid? ID,InternalTagRef_Types? Type) 
public ActionResult CreateTag(FormCollection FC, Guid ID, InternalTagRef_Types Type) 

当我点击搜索TagManagement操作参数得到适当的填充。当我点击SaveTag时,它会尝试调用CreateTag操作,但不能,因为它缺少ID和Type。我得到错误参数字典包含非空的类型'System.Guid'的参数'ID'的空项。它应该从URL中获得这些值,即像TagManagement那样的 http://localhost:1338/Tags/InternalTag/TagManagement/D104EBF5-470B-4FAA-9FC7-5391922CCE94/Projects。请帮忙。

+0

是的,每页有多种形式是一个很好的主意 - 每形式限制的一个页面的WebForms的主要烦恼之一IMO – 2010-12-14 10:30:43

回答

3

您的第二个表单不包含任何输入字段(除了提交按钮),所以当提交表单时,没有任何内容被发送到服务器,并且控制器操作没有任何内容可以绑定。因此,您需要像第一种形式那样包含文本字段或隐藏字段。


UPDATE:提交时

<% using (Html.BeginForm(
     "CreateTag", "InternalTag", 
     new { id = RouteData.Values["id"], type = RouteData.Values["type"] }, 
     FormMethod.Post)) { %> 
    <%: Html.AntiForgeryToken() %> 
    <div id="AddTag"> 
     <input id='SaveTag' type='submit' value='Save' style='width: 125px' /> 
    </div> 
<% } %> 
+0

嗨对不起,我的问题是不是我描述编辑。 ID和类型应该从U.R.L – David 2010-12-14 10:32:28

+0

@ user351709检索,据我所知,请参阅我的更新,了解如何在生成的表单操作中包含路由参数。 'RouteData.Values [“xx”]'将使用路由引擎从当前url获取参数的值。 – 2010-12-14 10:45:58

1

我建议,包括在这个形式的隐藏字段,这将有你的标签,因此:

你冷在生成的行动路线参数形式您的标签将可用。其次,同样重要的是

<input id="Create" type="button" value="Add to New Tag" onclick="AddTagElements()" /> 

AddTagElements javascript函数需要用新的标签(一个或多个),以更新的隐藏字段的值。

<% using (Html.BeginForm("CreateTag","InternalTag",FormMethod.Post)){%> 
    <%: Html.AntiForgeryToken() %> 
    <div id="AddTag"> 
     <input id="tags" type="hidden" value=""/> 
     <input id='SaveTag' type='submit' value='Save' style='width: 125px' /> 
    </div> 
<%}%>