2012-12-03 88 views
1

我有一個MVC控制器,可以通過表單提交在幾個不同的地方被稱爲正常工作。然後,控制器呈現一個視圖,其主要目的是允許用戶發送文檔或將其發佈到外部網站,並填寫將用於通知電子郵件的文本字段。MVC控件不無刷新頁面

我對這些領域進行驗證 - 用戶可以輸入自定義主題/正文。如果他們不這樣做,他們會收到一個彈出提醒,並可以返回到表單或使用佔位符值中指示的默認文本提交。

的問題是,當用戶第一次到達這個頁面,點擊發送按鈕,在文本框中輸入沒有實際註冊和它給空字符串通知,無論什麼是真正的領域;然而,如果我打F5並再試一次,輸入完美地工作。

我覺得這事做與最初通過調用POST操作正在做這個控制器,而它似乎很好地工作在頁面刷新獲取表單提交。我無法弄清楚如何在通過POST調用控制器時讓內容正確響應,或者如何在不發佈數據的情況下提交表單。

預先感謝閱讀和任何幫助。

這裏是呼叫控制器:

public ActionResult Index(FormCollection collection) 
    { 
     //modelbuilding code 
     return View (Model); 
    } 

調用控制器始終使用此格式的代碼。(在這種情況下,它會從收件人/索引視圖稱爲

@using(Html.BeginForm("Index", "Distribution", FormMethod.Post)) { 
    //form values 
    <input type="submit" data-role="button" value="Done"/> 
} 

這裏是視圖的相關部分和JS驗證功能:

<div id="SubjectTemplate"> 
    <p>Subject: <input id="emailSubjectTextBox" name="EmailSubject" placeholder="@EmailSubject" /></p> 
</div> 

<a href="javascript:validateInput();">Send Notification</a> 

<script>    
    function validateInput() { 
     var possibleErrors = []; 
     if (!(document.getElementById('emailSubjectTextBox').value)) { 
       possibleErrors.push('@incompleteEmailSubject' + '\n'); 
     } 
     //more validation that works the same way and has the same problem 
     if (possibleErrors.length > 0) { 
      if (confirm(possibleErrors)) 
      { 
       window.location.href = '@Url.Action("Send")' 
      } 
     } 
     else { 
       window.location.href = '@Url.Action("Send")' 
     } 
    }     
</script> 

回答

0

我發現jQueryMobile自動利用AJAX發佈表單導致的問題。我通過將new {data_ajax = "false"}包含到Html.BeginForm聲明中來解決此問題。

1

我米不知道我完全理解你的問題,但一般來說,你不應該使用POST和GET相同的動作。

更重要的是,你不應該使用POST如果你的動作並沒有某種副作用。如果你正在使用表單提交進行某種選擇,那麼你應該使用GET。

請參閱以下職位的詳細信息以及如何使用jQuery執行AJAX GET請求的例子:http://www.jquery4u.com/ajax/key-differences-post/

無論你正在做什麼,這是非常好的做法,POST調用執行某些操作,並然後重定向到返回給用戶的GET操作。

[HttpPost] 
public ActionResult Index(FormCollection collection) 
{ 
    //do whatever you need to save the record 
    return RedirectToAction("Index") 
} 

[HttpGet] 
public ActionResult Index() 
{ 
    //modelbuilding code 
    return View (Model); 
} 

這不僅可以幫助您控制堅持REST風格的方法,它也停止用戶使用那惱人的「您確定要重新提交此頁」如果他們碰巧按F5

希望這有助於。

+0

嗯。有問題的控件仍然沒有正確響應,雖然這確實幫助我清理了一些代碼冗餘,所以非常感謝。 – gutsmania

+0

很高興我可以得到一些幫助。我還發現可以幫助的是嘗試隔離導致問題的代碼。要麼開始一個新項目,要麼舉一個工作示例,一次處理一行內容。如果你慢慢做,你會發現導致你麻煩的線或區域。祝你好運! –