MVC 3 - привязка к сложному типу со свойством типа List - PullRequest
5 голосов
/ 24 августа 2011

У меня есть следующая модель представления, и она будет использоваться элементом управления поиском, над которым я работаю.

public class SearchViewModel
{
    public SearchViewModel()
    {
        SearchLocation = new SearchLocationViewModel();
        SearchCategories = new SearchCategoriesViewModel();
    }

   public SearchLocationViewModel SearchLocation { get; set; }
   public SearchCategoriesViewModel SearchCategories { get; set; }
}

Теперь SearchCategoriesViewModel имеет следующую структуру:

public class SearchCategoriesViewModel
{
    [Display(Name = "Categories")]
    public IList<SearchCategoryViewModel> Categories { get; set; }

    public SearchCategoriesViewModel()
    {
        Categories = new List<SearchCategoryViewModel>();
    }
}

И, наконец, модель просмотра категории поиска имеет следующую структуру:

    public class SearchCategoryViewModel
    {
        [Required]
        [Display(Name="Id")]
        public int Id { get; set; }

        [Display(Name="Name")]
        public String Name { get; set; }

        public bool IsSelected { get; set; }
    }

Когда я отправляю запрос на поиск, SearchLocationViewModel проходит через отправленные параметры, однако SearchCategoriesViewModel проходит через пустой (не ноль).

Ниже приведен шаблон редактора для моей SearchCategoryViewModel:

@model MyDLL.WebUI.Models.SearchCategoriesViewModel

@foreach (var c in Model.Categories)
{
    @Html.Label(c.Name);
    @Html.CheckBox(c.Name,c.IsSelected);
}

Я использую следующий вид для генерации элементов управления поиском:

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true) 

    <div id="search">
        @Html.EditorFor(m => m.SearchCategories, "SearchCategory")            
        @Html.EditorFor(m => m.SearchLocation, "SearchLocation")            
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>    
}   

Я получаю следующую разметку:

   <h2>Search</h2>

<form action="/Settings/Search" method="post">        


<label for="SearchCategories_Professional">Professional</label>
<input id="SearchCategories_Professional" name="SearchCategories.Professional" type="checkbox" value="true" />
<input name="SearchCategories.Professional" type="hidden" value="false" />

<label for="SearchCategories_Associate">Associate</label><input id="SearchCategories_Associate" name="SearchCategories.Associate" type="checkbox" value="true" />
<input name="SearchCategories.Associate" type="hidden" value="false" />            

        <p>
            <input type="submit" value="Create" />
        </p> 

</form>

Я подозреваю, что параметры не передаются, потому что сгенерированная разметка неверна. Кто-нибудь из вас пытался создать частичные представления из сложных объектов? Я не хочу передавать IEnumerable, я бы предпочел инкапсулировать его в отдельный класс, чтобы я мог расширять / удалять его в будущем при необходимости.

Спасибо

1 Ответ

5 голосов
/ 24 августа 2011

Поскольку у вас есть статический список, вы можете быстро взломать свой способ создания разметки, которая будет связана правильно:

@model MyDLL.WebUI.Models.SearchCategoriesViewModel
@{
    var i = 0;
}
@foreach (var c in Model.Categories) 
{
    @Html.Hidden("Categories[" + i.ToString() + "].Id", c.Id);
    @Html.Hidden("Categories[" + i.ToString() + "].Name", c.Name);
    @Html.Label(c.Name);
    @Html.CheckBox("Categories[" + i.ToString() + "].IsSelected",c.IsSelected);
} 

Это быстрое и безобразное решение. Однако я бы посоветовал вам пересмотреть способ создания разметки при частичном просмотре.

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