Помогите со сложными объектами ModelBinding в .net - PullRequest
1 голос
/ 09 февраля 2011

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

UserViewModel состоит из строк, таких как Имя, Фамилия, Адрес.

Первоначально я просто передавал UserViewModel в качестве параметра действияно теперь мне нужно упаковать UserViewModel внутри accountRequest.

однако теперь мой связыватель моделей не будет сопоставлять строки в httpContext.Request с моим UserViewModel внутри AccountRequest.Все булевы карты очень хороши.

Есть ли простой способ получить его данные для сопоставления со свойствами UserViewModel, кроме его жесткого кодирования?

Я пытался это сделать, но мне это не понравилось.(упрощенно)

Dim accountRequest As New AccountRequest
Dim user As New UserViewModel

If Not String.IsNullOrEmpty(controllerContext.HttpContext.Request("Firstname")) Then
  user.FirstName = controllerContext.HttpContext.Request("Firstname")
End If

accountRequest.CurrentUser = user
Return accountRequest

Очевидно, что любая помощь очень ценится.Заранее спасибо!

1 Ответ

0 голосов
/ 09 февраля 2011

Извините - только что понял, что ваш код VB, и я ответил на C #

Это может быть связано с тем, что связыватель модели теперь ищет modelname.property вместо property в ValueProviders и ранее, поскольку это был параметр метода прямого действия, он просто искал property.

Теперь, когда тип модели является членом другого, имя его свойства будет использоваться в качестве префикса, и я не верю , вы можете удалить это требование (можете попробовать Bind(Prefix="") для параметра, но я не думаю, что это сработает).

Предполагается, что вы не привязываете индивидуально каждое свойство, и DefaultModelBinder выполняет некоторые из этих свойств для вас.

Вы должны иметь возможность заставить его работать без изменения кода, изменив строку запроса на ?modelname.property=[value]. Если вы используете форму, то вам следует рассмотреть возможность использования метода расширения Html.EditorFor - так как он заботится о наименовании модели (при условии, что ваши имена членов ViewModel и имена входных моделей согласованы). Но как пример из строки запроса:

public class MyObject{
  public string StringValue { get; set; }
}

public class MyObjectOuter{
  public MyObject Nested { get; set; }
}

public ActionResult Index(MyObjectOuter obj);

Значение obj.Nested.StringProperty может быть заполнено: /Index?Nested.StringValue=hello%20world, поскольку префикс obj в любом случае неявен.

Если вам не нравится это, у вас есть несколько вариантов:

1) Измените сигнатуру метода, чтобы получить два параметра:

public ActionResult Index(MyObjectOuter outer, MyObject nested)

А затем в теле вы сразу копируете nested в свойство obj.Nested. Это немного смешно, но это сработает.

2) Вручную заставьте привязку свойств вашего класса использовать значения без префикса из ValueProviders (но тогда вы ограничиваете тип вашей модели, чтобы работать только с определенными типами запросов - что не совсем гибко ).

3) Или, как я уже говорил ранее, если эти свойства связаны с формой Http, используйте Html.EditorFor для создания разметки - он автоматически генерирует входные данные с правильными именами, если они не изменяются с вход-> выход.

...