2013-05-11 2 views
1

Моя проблема как это, Im пытается получить модель объекта с целью после seinding его с формой, модель выглядит следующим образом:нуль на HttpPost на ASP.NET

public class PackageModel 
{ 
    public PackageDTO Package { get; set; } 

    public IEnumerable<SelectListItem> Allcategories { get; set; } 

} 

в то время как PackageDTO просто объект DTO, координирующий многие атрибуты. Теперь представление для этой модели ist просто показывает атрибуты, и эта модель будет отправлена ​​в запросе httppost на индексную страницу как обычно (там она будет обработана ans сохранена), Метод индекса в контроллере Выглядит так:

[HttpPost] 
    public ActionResult Index(PackagemODEL packageModel, FormCollection form) 
    { 

    } 

Теперь я не знаю, что я делаю неправильно, но packageModel объект не является абсолютно пустым, просто список Allcategories и другая строка атрибутов в объекте PackageDTO, остальное, кажется, работает.

мнение содержит этот код

<fieldset> 
<legend>@Resources.AppvManagementService_EditPackage_Title</legend> 
@using (Html.BeginForm("Index","WantedController",FormMethod.Post,new {enctype="multipart/form-data"})) 
{ 

    @Html.ValidationSummary() 

    <labelName </label>@Html.TextBoxFor(model=>model.Package.Name) <br/> 
    <label>Sid </label>@Html.TextBoxFor(model=>model.Package.Sid,new {@disabled="disabled"}) <br/> 
    <label>Category </label>@Html.DropDownList("CategoryName",Model.Allcategories,Model.Package.Category)<br/> 

    <label>Description: </label>@Html.TextBoxFor(model=>model.Package.Description) <br/> 


    <label>Type: </label>@Html.TextBoxFor(model=>model.Package.Type) <br/> 

    <button type="submit">submit</button> 
} 

Doest нибудь есть какие-либо идеи, почему IST как это ?? я делаю что-то неправильно (я уверен, я :))

ТНХ на каждый

ответ

1

Как вы ожидаете Allcategories заселяться? В вашем представлении содержится поле, в котором указано значение под именем "CategoryName" - в вашем представлении нет ничего, что заполняет список категорий. Важнее; вам действительно необходимо его необходимо заполнить? Мне кажется, что Allcategories действительно необходим только для заполнения раскрывающегося списка. На этом посту вам не нужно. Если Вы ДЕЙСТВИТЕЛЬНО все еще нужно, вы будете иметь либо:

заселить в контроллере на HttpPost метода:

[HttpPost] 
public ActionResult Index(PackagemODEL packageModel, FormCollection form) 
{ 
    packageModel.Allcategories = new IEnumerable<SelectListItem>(); 
} 

загромождать ваш взгляд с бессмысленными скрытых полей, чтобы передать значения обратно в (я бы не рекомендовал это для списка элементов, если вы действительно не нужно):

@for (int i = 0; i < Model.Allcategories.Count; i++) 
{ 
    @Html.HiddenFor(m => m.Allcategories[i]) 
} 

занесения его в модели конструктора:

public class PackageModel 
{ 
    public IEnumerable<SelectListItem> Allcategories { get; set; } 

    public PackageModel() 
    { 
     Allcategories = new IEnumerable<SelectListItem>(); 
     /* Add values to Allcategories here */ 
    } 
} 

Если значения Allcategories не изменяются, вы также можете рассмотреть возможность создания свойства вашей модели static readonly и жесткого кодирования значений (или вытаскивания их из файла конфигурации или аналогичного).

Что касается возвращения выбранного CategoryName, вам нужно поле в модели, в которой хранить его, в противном случае единственный способ доступа к нему в данный момент через Request.Form:

public class PackageModel 
{ 
    public IEnumerable<SelectListItem> Allcategories { get; set; } 
    public string CategoryName { get; set; } 
} 

@Html.DropDownListFor(m => m.CategoryName, Model.Allcategories, Model.Package.Category) 

В сторону: Пожалуйста, пожалуйста, , пожалуйста, извлеките DTO из своей модели и установите соответствующие свойства в своей модели. Ваш DTO не принадлежит в вашей модели модели, что является моделью для вашего зрения и ничего более.

+0

Я пробовал его с @ Html.DropDownListFor (m => m.CategoryName, Model.Allcategories, Model.Package.Category) , но все же я получаю нулевые элементы в списке (но не null), И если я сделаю что-то вроде этого, как я могу найти, какой объект я выбрал из списка, потому что в опубликованной модели, у меня все еще есть старая , я получаю эту проблему, имея скрытые атрибуты в представлении, но я подумал, что это может быть сделано лучше, и почему вы думаете, что мне нужно взять DTOout моей модели? быть лучше, чем копировать тот же код снова Я хотел расширить модельный класс, как вы думаете, это хорошо? – Bafla13

+0

Мне жаль, что я не смог упаковать каждую вещь, которую я хотел сказать в одном посте, но я надеюсь, что я хорошо себя зарекомендовал, и thx :) – Bafla13

+0

Думаю, вам нужно немного перечитать мой ответ. Вы получаете выбранное значение из свойства 'CategoryName', которое я добавил, и - если вам нужно вернуть список значений в POST (что я не уверен, что вы это делаете) - вам нужно реализовать одну из опций, которые я описал выше. DropDownList не возвращает вам значения списка, а только выбранный элемент. –

Смежные вопросы