ASP.NET MVC - RenderAction - PartialView - BeginForm() - 多种形式

时间:2010-02-06 05:37:33

标签: c# asp.net-mvc

所以我有这个ascx(partialView)控件 - ControlTemp

我在ControlTemp中有一个ajax.BeginForm,如下所示:

<% using (Ajax.BeginForm("ControlTemp",  new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "divControlTemp" })) {
        ....
        <input type = "submit"  />
        <%}%>

在我的母版页中,我使用此partialView作为

<div id = "divControlTemp">  <% Html.RenderAction("ControlTemp", "Home", null); %></div>

现在的问题是,如果我有一个页面正在使用这个母版页并且该页面发布了回发帖子,那么这个函数也被触发了:

[ActionName("ControlTemp"), AcceptVerbs(HttpVerbs.Post)]
        public ActionResult ControlTemp(string URL)
        {
            ...
            return PartialView("ControlTemp");
        }

注意:即使我使用Html.BeginForm而不是Ajax.BeginForm,上述方法仍然会被触发

使用此主页的页面:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="loginTitle" ContentPlaceHolderID="TitleContent" runat="server">
   Log On
</asp:Content>

<asp:Content ID="loginContent" ContentPlaceHolderID="MainContent" runat="server">
   <h2>Log On</h2>
<p>
    Please enter your username and password. <%= Html.ActionLink("Register", "Register") %> if you don't have an account.
</p>
<%= Html.ValidationSummary("Login was unsuccessful. Please correct the errors and try again.") %>

**<% using (Html.BeginForm("LogOn", "Account")) { %>**
    <div>
        <fieldset>
            <legend>Account Information</legend>
            <p>
                <label for="username">Username:</label>
                <%= Html.TextBox("username") %>
                <%= Html.ValidationMessage("username") %>
            </p>
            <p>
                <label for="password">Password:</label>
                <%= Html.Password("password") %>
                <%= Html.ValidationMessage("password") %>
            </p>
            <p>
                <%= Html.CheckBox("rememberMe") %> <label class="inline" for="rememberMe">Remember me?</label>
            </p>
            <p>
                <input type="submit" value="Log On" />
            </p>
        </fieldset>
    </div>
<% } %>

请参阅上面代码中的Html.BeginForm ...正在触发LogOn ActionMethod,但它也会触发另一种形式的ActionMethod!

另一个人发布了这个问题,但他/她没有解决方案:

POST method called on MVC UserControls as well as their parent views

注意:没有嵌套表单

3 个答案:

答案 0 :(得分:2)

为什么不使用jQuery。按钮代码:

<input type="submit" id="submitButton"  />

jQuery代码:

$(document).ready(function() {
    $('#submitButton').click(function() {
        $('#divControlTemp').load('Controller/Action/Parameters');
    });
});

答案 1 :(得分:1)

问题是MVC在父视图中为其中的每个RenderAction()调用复制HTTP方法,无论其形式是否实际发出了回发。

您必须按照我的方式创建自己的功能。我已经改写了这个,所以我可以打电话给Html.RenderAction(HttpVerb.Get, ... )。这使得总是可以将一些操作呈现为GET,无论包含页面是否是POST调用。在您的情况下,这将解决问题,因为在主服务器上呈现部分视图(使用ajax形式)应始终作为GET调用。无论如何,你Ajax会发布POST。

答案 2 :(得分:1)

发布操作应该返回相同的结果,并通过以下编码获得:

[ActionName("ControlTemp"), AcceptVerbs(HttpVerbs.Post)] 
        public ActionResult ControlTemp(string URL) 
        { 
            if(this.ControllerContext.IsChildAction)
                 return  ControlTemp()//Get action method
            ... 
            return PartialView("ControlTemp"); 
        }