RedirectToAction and “Object moved to here” error

2019-07-07 08:40发布

问题:

I'm having a strange issue with RedirectToAction in MVC 3.0.

Here is the code of my sample ViewModel

public class EventViewModel
{
  [Required(ErrorMessageResourceType = typeof(Resources.Validations), ErrorMessageResourceName = "Required")]
  public DateTime CreationDate { get; set; }

  [Required(ErrorMessageResourceType = typeof(Resources.Validations), ErrorMessageResourceName = "Required")]
  [AllowHtml] //here is my apparent problem
  public string Description { get; set; }

  [Required(ErrorMessageResourceType = typeof(Resources.Validations), ErrorMessageResourceName = "Required")]
  [Range(0, 5, ErrorMessageResourceType = typeof(Resources.Validations), ErrorMessageResourceName = "RangeValue")]
  public int Rating { get; set; }
  [Required(ErrorMessageResourceType = typeof(Resources.Validations), ErrorMessageResourceName = "Required")]
  public string Title{ get; set; }

  ...other properties...

}

Here is the two methods of my controller

public ActionResult Edit(int id)
{
  var entity = eventsRepository.Get(id);
  if (entity == null)
    return RedirectToAction("Index");
  var eventVM = new EventViewModel();
  eventVM.Description = entity.Description;

  ... set the other properties ...

  return View(eventVM);
}

[HttpPost]
public ActionResult Edit(int id, EventViewModel model)
{
  if (ModelState.IsValid)
  {
    try
    {
      var entity = eventsRepository.Get(id);
      if (entity == null)
        return RedirectToAction("Index");
      entity.CreationDate = model.CreationDate;
      entity.Description = model.Description;

      ... set the other properties ...

      eventsRepository.Save(entity);
      return RedirectToAction("Index");
    }
    catch (Exception e)
    {
      ModelState.AddModelError("", "An error occured bla bla bla");
    }
  }

  return View(model);
}

My problem is, if I remove the AllowHtmlAttribute and insert plain text in the description field, all is ok and I get my redirect after save, but if I put the AllowHtmlAttribute on the field description and insert some Html text, after save instead of the redirect I get a blank page with only this text:

Object moved to here. 

If I click on "here", I'm redirected to the right url.

Am I missing something obvious?

回答1:

Its actually cause by a httpModule interfering with mvc. I had same issue and fixed it by removing the following from the main web.config.

<add type="DevExpress.Web.ASPxClasses.ASPxHttpHandlerModule, DevExpress.Web.v11.1, Version=11.1.10.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" name="ASPxHttpHandlerModule" />


回答2:

read this forum post. the short of it is that you will receive that error message when the http headers have been modified before the redirect is processed. i'm not sure entirely how the [allowhtml] attribute could cause that, but at least its a jumping point i suppose.



回答3:

RedirectToAction will send a new HTTP Response to the browser. I don't understand what ASP.Net is doing behind the scenes, but apparently it's creating a page that has a link to the Action you specified in the RedirectToAction call.

I'm not entirely clear on what entity is in Edit(int id, EventViewModel model), but it seems like you can use it to get the EventViewModel you need for the Edit view.

In

Edit(int id, EventViewModel model)

After

... set the other properties ...

eventsRepository.Save(entity);

Add

var eventVM = new EventViewModel();
eventVM.Description = entity.Description;

... set the other properties ...

return View(eventVM);