2015-10-02 52 views
2

所以我有點被這個難住。我有多個頁面,使用各種數據在後端對我的C#控制器進行了大量成功的Ajax調用,但現在我正在嘗試構建一個簡單的小內容管理功能,並因此更新數據庫中的HTML來自JS編輯器的新HTML。我已經拿出了所有沉重的數據庫代碼,並將其縮小到這樣的事實,即我的控制器不會接受任何有關html標記的事情,或者我的ajax代碼無法發送它。通過AJAX調用將HTML傳遞給C#MVC控制器。 500錯誤

Ajax的功能是:

$.ajax({ 
      type: "POST", 
      url: '@Url.Action("UpdateContent", "Admin")', 
      data: { 
       elementId: elementId, 
       newContent: newContent 
      }, 
      dataType: "json", 
      success: function (data) { 
       if (data.result == 'true') { 
        infoMessage('Content Updated!', 'success'); 
       } else { 
        infoMessage('Error: ' + data.result + '. Nothing has been updated!', 'error'); 
       } 
      }, 
      error: function() { 
       alert('There was a problem contacting the server.'); 
      } 
     }); 

而且在我的控制端,我帶走了所有的代碼只留下一些調試寫入線。

[HttpPost] 
    public ActionResult UpdateContent(string elementId, string newContent) 
    { 
     System.Diagnostics.Debug.WriteLine("!" + elementId); 
     System.Diagnostics.Debug.WriteLine("!" + newContent); 
     string _result = "true"; 
     return Json(new { result = _result }); 
    } 

現在有趣的事情是,當我在Ajax請求設置類似的東西<p>hello</p>data paramater有newContent那些writelines甚至不被調用,整個AJAX調用失敗。然而,當我只使用普通的字符串,例如hello它工作正常。我已經進一步縮小到只是開頭的html括號,所以即使<p也會失敗。

記住這一點,這裏發生了什麼?其次,通過Ajax將html發送回控制器的正確方法是什麼?所以這不會發生?

+0

500是內部服務器錯誤。調試沒有顯示任何異常? –

回答

6

ASP.NET有request validation默認情況下啓用以幫助防止XSS。您可以通過添加ValidateInput屬性到你的動作禁用此:

[HttpPost] 
[ValidateInput(false)] 
public ActionResult UpdateContent(string elementId, string newContent) 
{ 
    System.Diagnostics.Debug.WriteLine("!" + elementId); 
    System.Diagnostics.Debug.WriteLine("!" + newContent); 
    string _result = "true"; 
    return Json(new { result = _result }); 
} 

您還需要添加以下到您的web.config

<httpRuntime requestValidationMode="2.0" /> 

一個較新的(更好)的選擇是使用您將應用於模型屬性的AllowHtml屬性。這是首選,因爲你只允許這個道具繞過驗證而不是整個請求。

class MyModel 
{ 
    [AllowHtml] 
    public string MyHtml { get; set; } 
} 
相關問題