簡體   English   中英

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

[英]ASP.NET MVC - RenderAction - PartialView - BeginForm() - multiple forms

所以我有這個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!

另一個人發布了這個問題,但他/她沒有解決方案:

調用MVC UserControls的POST方法及其父視圖

注意:沒有嵌套表單

為什么不使用jQuery。 按鈕代碼:

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

jQuery代碼:

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

問題是MVC在父視圖中為其中的每個RenderAction()調用復制HTTP方法,無論其形式是否實際發出了回發。

您必須按照我的方式創建自己的功能。 我已經重寫了這個,所以我可以調用Html.RenderAction(HttpVerb.Get, ... ) 這使得總是可以將一些操作呈現為GET,無論包含頁面是否是POST調用。 在您的情況下,這將解決問題,因為在主服務器上呈現部分視圖(使用ajax形式)應始終作為GET調用。 無論如何,你Ajax會發布POST。

發布操作應返回相同的結果,以便通過以下代碼發布獲取:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM