Сообщения проверки, потерянные в POST-Redirect-GET в MVC - PullRequest
0 голосов
/ 30 июня 2009

У меня есть ProductController с действиями Index (который загружает пустую форму). Форма также публикуется сама по себе как ее сложная форма, а элементы формы, такие как раскрывающиеся списки, показывают опубликованные значения. код выглядит следующим образом

 public ActionResult Index()
    {
        int id;
        id = Convert.ToInt32(Request.Form["ddlLendingType"]);
        if (id == 0)
            id = 1;
        ProductCommonViewModel viewData = new ProductCommonViewModel(_prodRepository.Method1(),_prodRepository.Method2())
        return View(viewData);
    }

Когда я нажимаю кнопку Отправить в форме, продукт сохраняется, а в случае сбоя выводятся сообщения об ошибках проверки.

 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Save(FormCollection fc)
    { 
        Product product = new Product();
        try
        {
           ...fill out all properties from form collection
            _prodRepository.SaveProduct(product);

            return RedirectToAction("Index", "Product");
        }
        catch (Exception ex)
        {
            TempData["Message"] = "An Error Occured while saving the product!";
            Validation.UpdateModelStateWithRuleViolation(product, ViewData.ModelState);
            // WHEN I call redirect to action Index on this view I can see the TempData variable but I cannot see validation summary and individual validation messages.How do I persist the msgs across requests?
        }

    } 

Определение вспомогательного метода выглядит следующим образом:

public static void UpdateModelStateWithRuleViolation(IRuleEntity entity, ModelStateDictionary dictModel)
    {
        List<RuleViolation> violations = entity.GetRuleViolations();

        foreach (var item in violations)
        {
            dictModel.AddModelError(item.PropertyName, item.ErrorMessage);
        }
    }

Ответы [ 2 ]

2 голосов
/ 30 июня 2009

Передайте состояние модели в tempdata.

Кстати, вместо этого:

 public ActionResult Index()
    {
        int id; //and here You could join declaration with assignment
        id = Convert.ToInt32(Request.Form["ddlLendingType"]);

Вы можете сделать это:

 public ActionResult Index(int ddlLendingType)
        {

А использование FormCollection - плохая практика, которую не следует использовать. Для крайних случаев - создайте пользовательский механизм связывания модели ( CodeCampServer имеет довольно хороший механизм привязки) или фильтр действий ( Kigg `source).

1 голос
/ 05 февраля 2010

У меня была проблема с сохранением TempData для нескольких запросов, я сделал следующее, чтобы обновить TempData для каждого действия перенаправления:

protected override RedirectToRouteResult RedirectToAction(string actionName, 
    string controllerName, System.Web.Routing.RouteValueDictionary routeValues)
{
    TempData["Notice"] = TempData["Notice"];
    TempData["Error"] = TempData["Error"];
    TempData["Warning"] = TempData["Warning"];
    return base.RedirectToAction(actionName, controllerName, routeValues);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...