ASP.NET MVC генерация имени элемента формы - PullRequest
2 голосов
/ 16 февраля 2012

У меня есть класс, который выглядит так:

public class UserListVM
{
    public SearchModel SearchModel { get; set; }
    public PagedList<User> Users { get; set; }
}

public class SearchModel
{
    public string Text { get; set; }
    /* other properties */
}

Я отправляю UserListVM на мой взгляд, но действие принимает SearchModel:

public ActionResult Search(SearchModel filter)
{
        UserListVM model = new UserListVM();

        model.Users = userService.GetUsers(filter);
        model.SearchModel = filter;

        return View(model);
}

Мой взгляд:

@model UserListVM 

<form>
    @Html.TextBoxFor(m => Model.SearchModel.Text)
</form>

Но это порождает:

<input id="SearchModel_Text" name="SearchModel.Text" type="text" value="">

Который отправляет на действие UserListVM вместо SearchModel. Как я могу получить это, чтобы сгенерировать это:

<input id="Text" name="Text" type="text" value="">

Ответы [ 4 ]

2 голосов
/ 16 февраля 2012

Создайте частичное представление для вашей SearchModel и вызовите его, используя Html.Partial. Затем из этого частичного представления выполните все расширения EditorFor / TextBoxFor

Ваш взгляд - UserList.cshtml:

@model UserListVM

@using (Html.BeginForm())
{
    @Html.Partial("Search", Model.SearchModel)
}

Ваш взгляд - Search.cshtml:

@model SearchModel

@Html.TextAreaFor(m => m.Text)
2 голосов
/ 16 февраля 2012
@Html.TextBoxFor(m => m.SearchModel.Text, new { id = "Text" })

Использование перегруженного метода TextBoxFor(), который принимает второй параметр object (называемый htmlAttributes).Здесь вы можете указать атрибуты HTML для применения к элементу DOM, который вы используете в данный момент (в данном случае, ваш input элемент).

Edit : я считаю, что ваше лямбда-выражение неверноИзменить:

@Html.TextBoxFor(m => Model.SearchModel.Text)

На

@Html.TextBoxFor(m => m.SearchModel.Text)
// htmlAttributes omitted to show the issue

Редактировать Редактировать : оказывается, что даже с указанным атрибутом name он будет отображаться в соответствии с тем, чтодля формы требуется POST для обязательных полей.

Правка Правка Правка : Попытайтесь явно указать FormExtensions.BeginForm():

@using (Html.BeginForm("Search", "YourController", FormMethod.Post, null))
{
    @Html.TextBoxFor(m => m.SearchModel.Text)
}

Используйте это как замену вашего <form /> элемента.

0 голосов
/ 17 февраля 2012

Попробуйте сделать это вручную так:

@Html.TextBox("Text", Model.SearchModel.Text)
0 голосов
/ 16 февраля 2012

Если предположить, что представление больше, чем вы показали, почему бы просто не использовать метод поиска в модели UserListVM. Он будет содержать нулевую ссылку на пользователей, поэтому в сообщении не будет никаких дополнительных данных.

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