Как использовать (попробовать)UpdateModel?

Как правильно использовать (Try)UpdateModel?

Когда я запускаю это:

  • TryUpdateModel возвращает истину,
  • ViewData ошибок нет,
  • но мой Proxy не обновляется.

Метод действия

public void Save(string TypeName, int Id, FormCollection idontknow) {
    var types = Assembly.GetExecutingAssembly().GetTypes();
    var ObjectType=(from t in types where t.Name == TypeName select t).First();
    var Proxy = context.Set(ObjectType).Find(Id); // EF 4.1
    if (TryUpdateModel(Proxy, TypeName)) {
        var x = ViewData.GetModelStateErrors(); // no errors
    }
}

Размещенные данные

TypeName=Thing&Id=1&Thing.Id=1&Thing.Name=hello&Thing.OptionID=2

Класс вещей

public class Thing : Base {
    public virtual Nullable<int> OptionID { get; set; }
    public virtual Option Option { get; set; }
    public virtual ICollection<ListItem> ListItems { get; set; }
}
public class Base {
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    [NotMapped]
    public virtual int? EntityState { get; set; }
}

EDIT: я также пытался явно передать коллекцию форм TryUpdateModel(Proxy, TypeName, idontknow)

EDIT #2: (в ответ на NickLarsen)

  1. Перезапустил VS и сервер, без изменений.
  2. Значения фактически находятся в FormCollection.
  3. Мок данные работают! Я знаю, что, должно быть, здесь что-то напутал.
  4. Использование отладчика для проверки значений.

person Benjamin    schedule 29.07.2011    source источник


Ответы (1)


Я удалил весь материал EF и попытался получить только эту строку запроса, чтобы заполнить модель значениями... и это сработало просто отлично.

//controller class
public ActionResult Save(string TypeName, int Id, FormCollection idontknow)
{
    var Proxy = new Thing
    {
        Id = 33,
        OptionID = 2234,
        Name = "tony",
    };
    if (TryUpdateModel(Proxy, TypeName))
    {
        ViewBag.Message = "WInner";
    }

    return RedirectToAction("Index");
}
//end controller class

public class Thing : Base
{
    public virtual Nullable<int> OptionID { get; set; }
}
public class Base
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

Честно говоря, я не могу понять, что в вашем коде может помешать ему работать, но я бы предложил просмотреть список один за другим и протестировать после каждого шага...

  1. Сохраните свой прогресс и перезапустите VS и ваш сервер разработки.
  2. Убедитесь, что значения действительно находятся в данных формы, возможно, что-то там мешает.
  3. Смоделируйте некоторые мусорные данные, как это сделал я. (проверка, связана ли проблема с EF)
  4. Как вы определяете, что прокси не обновляется? В отладчике, на странице и т.д.?
  5. Отредактируйте свой вопрос с ответом на все вышеперечисленные вопросы.
person Nick Larsen    schedule 29.07.2011
comment
Спасибо за ответ. Я обновил вопрос. Может быть, мне стоит начать с нового тестового проекта..? - person Benjamin; 29.07.2011
comment
Я пока не очень понимаю прокси. Не получается из-за типа прокси != Thing? System.Data.Entity.DynamicProxies.Thing_38966D698AE5B953EEFA4FC1D5DC769DAA3F707D357584ACF00CBBD2254BECB1 - person Benjamin; 29.07.2011
comment
@Benjamin: Это вообще не должно иметь значения, TypeName просто указывает префикс для значений, которые должны соответствовать переданным атрибутам модели, не имеет значения тип модели, только ее свойства. - person Nick Larsen; 29.07.2011
comment
Хорошо, это хорошо. Странно, что тогда не работает. Я ищу альтернативные средства для той же цели, используя привязку пользовательской модели ссылка - person Benjamin; 30.07.2011