2015-02-08 32 views
0

我有這個頁面,其中包含2個窗體一個存在於佈局文件中,另一個存在於視圖文件中。第一種形式是通訊訂閱(ajax形式),它的位置在頁面的頁腳中很常見,這就是它在佈局中並呈現爲局部視圖的原因。我有另一種聯繫我們頁面的視圖,它有自己的形式(普通形式)。 我的問題是,當我提交聯繫我們表單時,代碼也進入訂閱表單的操作方法,並返回一個模型錯誤與JsonResult導致整個視圖呈現爲文本。我只想要執行聯繫我們表單的操作方法。如何在asp.net mvc視圖中只執行一個表單動作方法?

這裏是一個局部視圖文件

@model MyApp.Models.Subscriber 
@using (Ajax.BeginForm("NewsletterSubscription", "Shared", null, new AjaxOptions 
    { 
     HttpMethod = "POST", 
     OnBegin = "OnBegin", 
     OnComplete = "OnComplete", 
     OnFailure = "OnFailure" 
    }, new { id = "subscribeForm" })) 
    { 
     @Html.AntiForgeryToken() 
     @Html.TextBoxFor(model => model.SubscriptionEmail) 
     @Html.ValidationMessageFor(model => model.SubscriptionEmail) 
     <input id="btnSubscribe" type="submit" value="Subscribe" /> 
    } 

的認購表格,這是它是如何在_layout.cshtml文件中呈現

@{ Html.RenderAction("NewsletterSubscription", "Shared"); } 

下面是聯繫我們的視圖文件的其他形式的

@using (Html.BeginForm("Index", "Contact", FormMethod.Post, new { id = "contactForm" })) 
    { 
     @Html.AntiForgeryToken() 
     <div class="theForm"> 
      <div class="theFormUnit"> 
       <p>Fullname</p> 
       @Html.TextBoxFor(model => model.Name) 
       @Html.ValidationMessageFor(model => model.Name) 
      </div> 
      <div class="theFormUnit"> 
       <p>Email</p> 
       @Html.TextBoxFor(model => model.Email) 
       @Html.ValidationMessageFor(model => model.Email) 
      </div> 
      <div class="theFormUnit"> 
       <p>Phone</p> 
       @Html.TextBoxFor(model => model.Phone) 
       @Html.ValidationMessageFor(model => model.Phone) 
      </div> 
      <div class="theFormUnit"> 
       <p>Message</p> 
       @Html.TextAreaFor(model => model.Message) 
       @Html.ValidationMessageFor(model => model.Message) 
      </div> 
      <input type="submit" value="Submit" /> 
     </div> 
    } 

當我調試代碼時,首先聯繫我們的action方法是執行d然後是訂閱的操作方法,並返回錯誤,因爲沒有提供電子郵件。

訂閱操作方法

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult NewsletterSubscription(Subscriber subscriber) 
{ 
    if (ModelState.IsValid) 
    { 
    } 
    else 
    { 
     return Json(new { success = false, message = "Failure Message" }); 
    } 

    return Json(new { success = true, message = "Success Message"}); 
} 

和我們聯繫的操作方法

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Index(ContactViewModel contact) 
{ 
    if(ModelState.IsValid) 
    { 
    } 
    else 
    { 
    } 
    return View(contact); 
} 
+0

你確定的佈局形式不渲染您聯繫形式?首先檢查頁面的視圖源以確保表單不嵌套。 – 2015-02-08 15:26:05

+0

我已經檢查過,表單不是嵌套的,這兩個表單都正確呈現與其他html元素之間。 – Yasmine 2015-02-08 15:38:00

+0

在這種情況下,可能有些JavaScript正在這樣做。你是否在任何js中使用這些表單元素,因爲你給它們分開了id? – 2015-02-08 15:47:07

回答

0

我嘗試了兩種解決方案的第一個部分解決了這個問題,另一個解決它完全。

首先解決辦法是添加以下線路中的認購表格

if (!Request.IsAjaxRequest()) 
{ 
ModelState.Clear(); 
return PartialView("Partial/_NewsletterSubscription"); 
} 

這裏我檢查的操作方法,如果請求不是一個Ajax請求,這意味着它的聯繫人我們回發請求窗體,在這種情況下,我清除模型狀態以刪除錯誤並返回一個新的局部視圖。雖然這個解決方案解決了這個問題,但我並不滿意,因爲我並不確定訂閱表單的action方法是通過contact us表單的action方法執行的。

因此,後來我想到了另一個簡單的解決方案,它完全解決了問題,並且在提交聯繫我們表單時,執行沒有進入訂閱表單的操作方法。 我只是從「NewsletterSubscription」改變了操作方法名稱爲「訂閱」所以不是

@using (Ajax.BeginForm("NewsletterSubscription", "Shared", null, new AjaxOptions 

我改成了

@using (Ajax.BeginForm("Subscribe", "Shared", null, new AjaxOptions 
相關問題