Модель MVC ViewData null после пост-возврата к действию контроллера - PullRequest
2 голосов
/ 19 марта 2012

У меня есть простое MVC 4 (бета) приложение и я только что заметил что-то, что, как я полагаю, может быть обработано по-другому. В этом случае, когда вызванное ниже действие продукта называется, модель создается и присваивается ViewData для использования в View . Это все работает нормально, свойство Model не равно нулю, а использование Views в свойстве Model работает.

[HttpGet]
public ActionResult Product()
{
    return ExecuteFormRequest(View(), true, delegate
    {
        var model = Request.ParseFromQueryString<Product>();

        if (model != null)
        {
            ViewData.Model = model;
        }

        return View();
    });
}

Когда продукт обновляется и отправляется обратно в контроллер, все данные выглядят нормально, но если продукт не проходит проверку и я возвращаю View ActionResult (, как показано ниже ), View встречается исключение нулевой ссылки, поскольку свойство Views Model теперь имеет значение null

[HttpPost]
public ActionResult Product(Product product)
{
    if (!ModelState.IsValid)
    {
        return View();
    }

    // Do other business stuff and target new or same View    

    return View();
}

Это строка в View , которая приводит к исключению нулевой ссылки, поскольку свойство Model теперь имеет значение null.

@if (!string.IsNullOrEmpty(Model.MyValue)) {}

Я решил это, сбросив свойство Model (, как показано ниже ). Мне это кажется неправильным, и мне интересно, правильно ли я к этому отношусь. Любые идеи приветствуются?

[HttpPost]
public ActionResult Product(Product product)
{
    if (product!= null)
    {
        ViewData.Model = product;
    }

    if (!ModelState.IsValid)
    {
        return View();
    }

    // Do other business stuff and target new or same View    

    return View();
}

Ответы [ 3 ]

3 голосов
/ 19 марта 2012

Если у вас строго типизированная модель представления, почему вы используете viewdata? попробуйте это:

[HttpGet]
public ActionResult Product()
{
    return ExecuteFormRequest(View(), true, delegate
    {
        var model = Request.ParseFromQueryString<Product>();

        //if (model != null)
        //{
        //    ViewData.Model = model;
        //}

        //return View();
        return View(model);
    });
}

[HttpPost]
public ActionResult Product(Product product)
{
    if (!ModelState.IsValid)
    {
        //return View();
        return View(product);
    }

    // Do other business stuff and target new or same View    

    //return View();
    return View(product);
}

Причина, по которой вы видите поведение с вашим подходом, заключается в том, что HTTP не имеет состояния. В отличие от веб-форм, MVC не восстанавливает все ваши переменные после публикации. Каждый метод действия начинается с нового словаря ViewData.

1 голос
/ 25 сентября 2013

Если вы используете Action Link в View для перехода к Post Back Action.Форма не отправляется, что приводит к модели нулевых значений.попробуйте отправить форму по действующей ссылке. Щелкните событие, которое решит проблему.

Вот пример отправки формы по действующей ссылке

@Html.ActionLink("Save1", "Method1", "HelloWorld", @Model, new { onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" });
.
1 голос
/ 19 марта 2012

Почему вы используете ViewData?Не используйте это.Сделайте это простым и всегда передавайте модель представления в представление при его возврате:

[HttpGet]
public ActionResult Product()
{
    return ExecuteFormRequest(View(), true, delegate
    {
        var model = Request.ParseFromQueryString<Product>();

        return View(model);
    });
}

[HttpPost]
public ActionResult Product(Product product)
{
    if (!ModelState.IsValid)
    {
        return View(product);
    }

    // Do other business stuff and target new or same View    

    return View(product);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...