#asp.net-mvc #asp.net-mvc-3 #binding
#asp.net-mvc #asp.net-mvc-3 #привязка
Вопрос:
В моих представлениях я использую универсальный тип для модели, ItemModel<T>
.
Это позволяет мне иметь базовый тип в моей модели, и он отлично работает. Внутри ItemModel<T>
я прикрепляю фактическую сущность T к свойству с именем ‘Item’.
Допустим, я загружаю пользовательский элемент: на мой взгляд, я хотел бы сделать что-то вроде этого:
<%: Html.TextBoxFor(Model => Model.Item.NickName,
new { id="NickName", name="NickName" })%>
Поскольку объект добавляется через свойство Item, это генерирует атрибут name входного тега как ‘Item.Псевдоним’. При публикации MVC больше не может связать это со свойством User.NickName объекта user в моем контроллере
public ActionResult Login(User user, string redirectUrl)
и поэтому в мой пользовательский объект ничего не загружается. Есть ли способ это исправить? Я изучал возможность написания пользовательской bindingmodel или valueprovider, но, похоже, для чего-то такого простого потребуется много работы. Кроме того, я действительно не уверен, что это тот путь, которым нужно идти.
Мы высоко ценим любую помощь!
Ответ №1:
измените метод вашего actionresult из
public ActionResult Login(User user, string redirectUrl)
Для
public ActionResult Login(User Item, string redirectUrl)
таким образом, modelbiner сможет находить свойства пользовательского объекта с префиксом Item
Комментарии:
1. Это действительно работает?! Он отображает «Элемент. Ключ» (обычно просто «Key») к вашему объекту.key, если вы вызываете элемент экземпляра. Это документированная функция?
2. не уверен в документации, но изучил ее на собственном опыте (на собственном опыте 🙂
Ответ №2:
вы можете создать свои вспомогательные методы для создания этого текстового поля
public static MVCString MyTextBox<T>(this HtmlHelper html,T _item,String PropertyName)
{
TagBuilder myTag = new TagBuilder("input");
myTag.Attributes("type")="Text";
myTag.Attributes("id")=PropertyName;
myTag.Attributes("name")=PropertyName;
myTag.Attributes("value")=typeof(_item).GetProperty(PropertyName).GetValue(_item,null).toString();
Return MvcHtmlString.Create(selectTag.ToString())
}
Комментарии:
1. Я думаю, это сработало бы, но это большая ручная работа. Все мои представления используют конструкцию, поэтому мне пришлось бы создавать помощники для каждого столбца. Что я действительно хотел бы сделать, так это автоматически отобразить элемент. Что угодно к чему угодно.
2. Я обновил свой код, чтобы он был более универсальным при использовании. Сетевое отражение. Я надеюсь, что это поможет вам.