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");
}
https://stackoverflow.com/questions/34270192/server-cannot-append-header-after-http-headers-have-been-sent-exception-at-html – Amit
@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
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