Как повторно заполнить модель представления в ASP.NET MVC 2 после ошибки проверки? - PullRequest
1 голос
/ 15 марта 2010

Я использую ASP.NET MVC 2 и вот в чем проблема. Моя модель просмотра выглядит примерно так. Он включает в себя некоторые поля, которые редактируются пользователем, а другие - для отображения. Вот простая версия

public class MyModel 
{
    public decimal Price { get; set; } // for view purpose only

    [Required(ErrorMessage="Name Required")]
    public string Name { get; set; }
}

Контроллер выглядит примерно так:

public ActionResult Start(MyModel rec)
{
    if (ModelState.IsValid)
    {
        Repository.SaveModel(rec);
        return RedirectToAction("NextPage");
    }
    else
    {
        // validation error
        return View(rec);
    }
}

Проблема в том, что когда возникает ошибка проверки и я вызываю View (rec), я не уверен, что лучший способ заполнить мою модель представления значениями, которые отображаются только.

Старый способ сделать это, где я передаю коллекцию форм, я бы сделал что-то вроде этого:

public ActionResult Start(FormCollection collection)
{
    var rec = Repository.LoadModel();
    UpdateModel(rec);
    if (ModelState.IsValid)
    {
        Repository.SaveModel(rec);
        return RedirectToAction("NextPage");
    }
    else
    {
        // validation error
        return View(rec);
    }
}

Но при этом я получаю сообщение об ошибке UpdateModel(rec): Не удалось обновить модель типа «MyModel».

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 22 марта 2010

Я понял это. Если вы позвоните UpdateModel и возникнет ошибка проверки, это вызовет исключение. Обходной путь - вместо этого позвонить TryUpdateModel.

0 голосов
/ 15 марта 2010

Использование строгого типа. Вид

Если вы используете строгий тип, это должно работать из коробки:

ViewPage<MyModel>

Ваши поля должны отображаться как:

<%= Html.TextBoxFor(m => m.Name) %>

Вы не должны отображать свойства только для чтения в редактируемых полях. Когда вы снова отобразите недопустимое представление и предоставите переданный экземпляр объекта модели в действии контроллера, ваши значения должны быть заполнены в текстовом поле (или контейнерах только для строк), как и ожидалось.

Я не думаю, что у вас должны возникнуть какие-либо проблемы со свойством Price, но на всякий случай вы пытались использовать это объявление действия контроллера:

public ActionResult Start([Bind(Exclude = "Price")]MyModel rec)
{
    // ...
}
0 голосов
/ 15 марта 2010

Ваш установщик членских цен (вероятно) не должен быть публичным, вы можете рассмотреть возможность загрузки цены из того места, где она хранится в модели.

Другое дело, когда при рендеринге представления не отображается цена с текстовым полем (или другим типом ввода).

public class MyModel 
{


    public decimal Price 
    { 
        get
        { 
            return //get the value from something
        }
    } // for view purpose only

    [Required(ErrorMessage="Name Required")]
    public string Name { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...