2010-11-22 132 views
1

我有一个带有选项卡的窗体。从属于每个选项卡是部分视图。 当用户提交保存更改时,我想调用该部分视图的方法,因此对于使用(Html.BeginForm(...)%>)放入<%的局部视图,但这会被忽略,然后单击“提交” ,将调用与容器视图,而不是相关的方法,这是为什么?我该得到怎样这个工作MVC:窗体不在局部视图中呈现

观样子;

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Employee.Master" Inherits="System.Web.Mvc.ViewPage<SHP.WebUI.Models.HolidayRequestViewModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    HolidayRequest 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="EmployeeContent" runat="server"> 
    <% using (Html.BeginForm()) {%> 
    <%: Html.AntiForgeryToken() %> 
    <h2>Holiday Request</h2> 
    <p>You have <%: Html.DisplayFor(model => model.DaysAvailableThisYear) %> days left annual leave for this year 
    and <%: Html.DisplayFor(model => model.DaysAvailableNextYear) %> days left for next year.</p> 
    <p>If your request is approved and exceeds the number of days left, then those extra days will not be paid.</p> 
    <div id="tabs"> 
     <ul> 
      <li><a href="#tabs-1">Approver</a></li> 
      <li><a href="#tabs-2">Single Date</a></li> 
      <li><a href="#tabs-3">Date Range</a></li> 
     </ul> 
     <div id="tabs-1"> 
      <% Html.RenderPartial("GetApproverTab", Model); %> 
     </div> 
     <div id="tabs-2"> 
      <% Html.RenderPartial("GetSingleDateTab", Model); %> 
     </div> 
     <div id="tabs-3"> 
      <% Html.RenderPartial("GetDateRangeTab", Model); %> 
     </div> 
    </div> 
    <%: Html.HiddenFor(x => x.EmployeeId) %> 
      <% } %> 
</asp:Content> 

局部视图看起来像;

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SHP.WebUI.Models.HolidayRequestViewModel>" %> 

<% using (Html.BeginForm("GetSingleDateTab", "Employee", FormMethod.Post, new { id = "frmSingleDate" })) 
     { %> 
<p>Enter your day or part day of Annual Leave here.</p> 
<table> 
    <tr> 
     <td align="right">Date:</td> 
     <td><%: Html.EditorFor(x => x.SingleDate) %></td> 
    </tr> 
    <tr> 
     <td align="right">Morning Only:</td> 
     <td><%: Html.CheckBoxFor(x => x.MorningOnlyFlag) %></td> 
    </tr> 
    <tr> 
     <td align="right">Afternoon Only:</td> 
     <td><%: Html.CheckBoxFor(x => x.MorningOnlyFlag) %></td> 
    </tr> 
    <tr> 
     <td colspan="2" align="center"><input type="submit" value="Save" /></td> 
    </tr> 
</table> 
    <% } %> 

和控制器看起来像;

#region Employee Holiday Request 

public ActionResult HolidayRequest() 
{ 
    return View(new HolidayRequestViewModel(Employee.GetLoggedInUser().EmployeeId)); 
} 

[HttpPost] // This is the method that gets executed 
public ActionResult HolidayRequest(HolidayRequestViewModel hrvm) 
{ 
    if (ModelState.IsValid) 
    { 
     hrvm.Update(); 
     return View(new HolidayRequestViewModel(hrvm.EmployeeId)); 
    } 
    return View(hrvm); 
} 

[HttpPost] // This is the method I want to get executed. 
public ActionResult GetSingleDateTab(HolidayRequestViewModel hrvm) 
{ 
    if (ModelState.IsValid) 
    { 
     hrvm.Update(); 
     return View(new HolidayRequestViewModel(hrvm.EmployeeId)); 
    } 
    return View("GetSingleDateTab", hrvm); 
} 

#endregion 

回答

3

你不能在html中使用nester形式。

+0

你说得对。我必须在每个选项卡的新选项放入之前结束表格。 – arame3333 2010-11-22 09:29:34

+0

我看到了这个答案,并且字面意思是说。哦,这就是为什么。 – 2012-07-12 16:33:36

2

我发现了一个令人难以置信的解决方案。只需插入<脚本>标签以上<表格>标签。

<script type="text/javascript"> 
    // don't remove <script> tag 
</script> 

<form .... 
+0

我发现这工作;然而,我发现我嵌套了窗体,因为我的引导模态div在我的BeginForm()块内。一旦我将它们移到块之外,我就不需要脚本参考。唯一我会提醒的是,虽然这种方法适用于任何古怪的理由,但它可能会破坏道路。 – steveareeno 2016-08-15 19:34:30