2017-09-20 3 views
0
gesendet wurden

Ich baue meine erste Website mit C# und Twitter Bootstrap, und ich bekomme den Fehler "Server kann Header nicht anhängen, nachdem HTTP-Header gesendet wurden" Fehler in einem Post beim Finden Ein Validierungsproblem und eine TempData["ErrorMessage"] müssen nach einer return View(model) angezeigt werden. Der spezifische Fehler tritt in der HTML-Zeile @Html.AntiForgeryToken() auf. Der Fehler tritt nicht auf, wenn die Nachricht außerhalb der Validierung festgelegt und an die Ansicht zurückgegeben wird.Server kann Header nicht anhängen, nachdem HTTP-Header mit AntiForgeryToken

Ich habe versucht: Ändern der return View(model) in eine RedirectToAction ("Action", new { id = model.id }) und Redirect ("/Controller/Action/" + model.id.ToString()), die funktionieren, wenn die Linie außerhalb der Validierung ist, aber innerhalb der bedingten Validierung fehlschlägt; Einstellen der AntiForgeryConfig.SuppressXFrameOptionsHeader auf True innerhalb der Application_start; und ruft HttpContext.Response.Clear() auf, bevor Sie die TempData festlegen und zur Ansicht zurückkehren. Ich habe noch nicht versucht, Cookies zu manipulieren, da ich mir nicht sicher bin, wie ich das Anti-Fälschungs-Token gezielt ansprechen soll.

Alles, was ich tun möchte, ist die Rückkehr zur Ansicht mit der Fehlermeldung/Validierung Nachricht auf der Seite statt als Pop-up-Meldung angezeigt, und keine der oben genannten Methoden hat funktioniert. Weiß jemand, warum dieses Ziel außerhalb der Validierung funktioniert, aber nicht innerhalb davon? Vielen Dank im Voraus!

//Any return and message works correctly if done here 
try 
{ 
    //Various other validations using values pulled from database 

    if (model.NewString.Length > 50 || model.NewString.Length < 7) 
    { 
     //This throws the error 
     TempData["ErrorMessage"] = "Please enter a value of valid length."; 
     return View(model); 
    } 
} 
catch 
{ 
    TempData["ErrorMessage"] = "There has been an error."; 
    return RedirectToAction("Index"); 
} 

EDIT: hier ist die Aktion pro Amit Wunsch, wie sie ist.

[HttpPost] 
[ValidateAntiForgeryToken] 
[Authorize (Roles = "Administrator, Owner, Director, Manager")] 
[RequireSsl] 
public ActionResult CreateCustomer (CreateCustomerModel model) 
{ 
    dbEntities db = new dbEntities(); 

    var CurrentBusinessID = 0; 
    var CurrentPosition = ""; 
    var CurrentUserID = 0; 

    try 
    { 
     if (Session["CurrentUserID"] != null) 
     { 
      CurrentUserID = (int)Session["CurrentUserID"]; 
      CurrentBusinessID = (int)Session["CurrentBusinessInfoID"]; 
      CurrentPosition = (string)Session["CurrentPosition"]; 
     } 
     else 
     { 
      Response.Redirect("/Account/Logon"); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
     Response.Redirect("/Account/Logon"); 
    } 

    try 
    { 
     var account = db.uspGetAccount(model.AccountID).FirstOrDefault(); 
     AccountsModel thisAccount = new AccountsModel() 
     { 
      AccountID = model.AccountID, 
      BusinessID = account.BusinessID 
     }; 
     if (thisAccount.BusinessID != CurrentBusinessID) 
     { 
      Response.Redirect("/Home/Dashboard"); 
     } 

     if (model.Name == null || model.Name == "") 
     { 
      TempData["ErrorMessage"] = "Please enter a name."; 
      return View(model); 
     } 
     if (model.NewString.Length > 50 || model.NewString.Length < 7) 
     { 
      //This throws the error 
      TempData["ErrorMessage"] = "Please enter a value of valid length."; 
      return View(model); 
     } 

     db.AddCustomer(model.Name, model.NewString); 
    } 
    catch 
    { 
     TempData["ErrorMessage"] = "There has been an error."; 
     return RedirectToAction("Index"); 
    } 

    return RedirectToAction("Accounts"); 
} 
+0

https://stackoverflow.com/questions/34270192/server-cannot-append-header-after-http-headers-have-been-sent-exception-at-html – Amit

+0

@Amit - danke für der Link, aber ich habe die Antwort tatsächlich implementiert und es hat nicht funktioniert. Insbesondere wenn ich die Änderung an RedirectToAction und Redirect plus SuppressXFrameOptionsHeader in meiner Antwort erwähne, war das der Post, dem ich folgte. – jle

+0

Können Sie Ihren Controller-Code für diese Methode einfügen, wie es ist. Wenn Ihre if-Anweisung für Model.NewString nicht funktioniert, gibt es keine return-Anweisung. Außerdem können Sie Response.ClearHeaders() vor jeder Rückgabeanweisung versuchen. – Amit

Antwort

0

Dieses Problem wurde mit der Reponse.Redirect("/Home/Dashboard") innerhalb der if Anweisung innerhalb der die Validierung enthält try Anweisung durch Ändern gelöst. Das Ändern dieser Zeile, um RedirectToAction("Accounts") zurückzukehren, löste das Problem, obwohl ich nicht sicher bin warum.

if (thisAccount.BusinessID != CurrentBusinessID) 
{ 
    Response.Redirect("/Home/Dashboard");//Solve the problem by replacing this 
} 
+0

Überprüfen Sie mit Ihrem Debugger, Zeile für Zeile. https://blogs.msdn.microsoft.com/rickandy/2012/03/01/response-redirect-and-asp-net-mvc-do-not-mix/ – Amit

+0

https://stackoverflow.com/questions/159523/why-do-i-get-can nicht-Redirect-nach-http-Header-wurden-gesendet-wenn-ich-Anruf-res – Amit

+0

@Amit - Gute Infos, danke! – jle

Verwandte Themen