ASP.NET MVC 2.0 - данные во ViewModel теряются после публикации - PullRequest
2 голосов
/ 13 июля 2010

У меня есть контроллер под названием ProductController.Код контроллера указан ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Services.Abstract;
using Web.Models;
using Ninject;
using Services.Entities;

namespace Web.Controllers
{
    public class ProductController : Controller
    {

        IProductRepository productRepository;

        public ProductController(IProductRepository products)
        {
            productRepository = products;
        }


        [HttpGet]
        public ActionResult Create() {

            Product p = new Product {
                Id = 5
            };

            string theTitle = "The Title";

            var viewModel = new ProductViewModel {
                Product = p,
                TheTitle = theTitle
            };

            return View(viewModel);

        }

        [HttpPost]
        public ActionResult Create(ProductViewModel pvm) {

            if (ModelState.IsValid) {
                int result = productRepository.SaveProduct(pvm.Product);
                return Content(result.ToString());
            }
            else {
                return View(pvm);
            }

        }

    }
}

Я использую шаблон ViewModel для отправки различных битов информации в View.Например, я отправляю продукт с идентификатором по умолчанию, равным 5, и я также устанавливаю свойство заголовка [В стороне: это не рабочий код - просто тестовые данные: -)]

Пока все хорошо,Когда / Product / Create вызывается в первый раз, в представлении отображается мое свойство Title, а для Product Id по умолчанию устанавливается значение 5. Однако при публикации формы сохраняется только информация о продукте.Если ModelState не является допустимым, я снова отображаю представление для пользователя.Тем не менее, на этот раз заголовок не отображается (он установлен в ноль).Однако продукт отображается так, как и ожидалось.

Если возможно, я бы хотел отправить исходный заголовок обратно в представление, когда ModelState недопустим.Есть ли способ сделать это без использования Session, ViewData и TempData?

С уважением и заранее спасибо

1 Ответ

1 голос
/ 13 июля 2010

Если я вас правильно понимаю, краткий ответ «нет».

Если свойство ProductViewModel.TheTitle не является частью данных формы, публикуемых в методе Create POST, вам придется воссоздать его каким-либо образом . Вы на пути к тому, как можно сохранить это значение в нескольких запросах, но я бы спросил, действительно ли необходимо в конечном итоге пойти туда.

По моему мнению, если способ получения свойства Title в методе Create GET достаточно хорош для этих запросов, он также достаточно хорош для повторного создания его таким же образом в запросах POST. POST обычно требует больше ресурсов и времени для обработки (проверки, сохранения данных и т. Д.) Как есть, поэтому вы подвергаете себя дополнительным зависимостям и уязвимостям для возможной тривиальной оптимизации. Тем не менее, я уверен, что есть много сценариев, в которых ваш подход будет оправданным.

В вашем примере, поскольку свойство Title не используется для сохранения продукта и может эффективно игнорироваться, если вы все еще хотите сохранить его на этих страницах, не воссоздавая его, самым простым способом может быть включение его в скрытый поле формы, так что ваше связующее устройство для моделей поднимает его в дополнение к продукту. Просто знайте, что конечные пользователи могут изменить это значение, если они манипулируют полезной нагрузкой формы.

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