2015-03-17 3 views
3

У меня есть Gridview со списком производителей, связанных с производителями ... Таким образом, у каждого производителя есть Производитель (2 таблицы -> 2 объекта). Когда я хочу обновить элемент ManufacturerType, я могу обновить Title из Entity ManufacturerType, но также изменить отношение (Производитель), если выпадающее меню выбрано значение change..NET 4.5 Gridview с DropDownList в EditItemTemplate UpdateMethod

<asp:GridView ID="gvManufacturerTypes" runat="server" DataKeyNames="manufacturerTypeId" 
     AutoGenerateColumns="false" GridLines="Vertical" CssClass="gridview" 
     CellPadding="4" ItemType="Entities.Models.ManufacturerType" SelectMethod="GetManufacturerTypesWithParams" 
     UpdateMethod="UpdateItem" DeleteMethod="DeleteItem" 
     AllowPaging="true" AllowSorting="true" PageSize="20" PagerSettings-FirstPageText="Prvi" 
     PagerSettings-LastPageText="Zadnji" PagerSettings-Mode="NumericFirstLast" 
     OnCallingDataMethods="gvManufacturerTypes_CallingDataMethods"> 
     <Columns> 
      <asp:TemplateField HeaderText="Proizvajalec"> 
       <ItemTemplate> 
        <asp:Label ID="lblManufacturer" Text='<%# Item.Manufacturer.Title %>' runat="server" /> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:DropDownList ID="ddlManufacturers" runat="server" ItemType="Entities.Models.Manufacturer" SelectMethod="GetManufacturers" SelectedValue='<%# Item.Manufacturer.ManufacturerId %>' 
         DataTextField="Title" DataValueField="manufacturerId" OnCallingDataMethods="ddlManufacturers_CallingDataMethods">        
        </asp:DropDownList> 
       </EditItemTemplate> 
      </asp:TemplateField> 
      <asp:DynamicField DataField="Title" /> 
      <asp:CommandField ShowEditButton="true" EditText="Uredi" UpdateText="Shrani" CancelText="Prekliči" ItemStyle-Width="80" /> 
      <asp:CommandField ShowDeleteButton="true" DeleteText="Izbriši" ItemStyle-Width="80" /> 
     </Columns> 
     <PagerStyle CssClass="gridview_pager" /> 
    </asp:GridView> 

Он генерирует меня UpdateItem метод и изменить пункт загрузки и сохраните изменения разделов, как показано ниже:

// The id parameter name should match the DataKeyNames value set on the control 
    public void UpdateItem(int manufacturerTypeId, ModelMethodContext context) 
    { 
     ManufacturerType item = null; 

     // Load the item here 
     item = _manufacturerTypeRepository.GetAllWithRelations(m => m.Manufacturer) 
      .Where(x => x.ManufacturerTypeId == manufacturerTypeId).SingleOrDefault(); 

     if (item == null) 
     { 
      // The item wasn't found 
      context.ModelState.AddModelError("", String.Format("Proizvajalec z idjem {0} ne obstaja.", manufacturerTypeId)); 
      return; 
     } 
     context.TryUpdateModel(item); 
     if (context.ModelState.IsValid) 
     { 
      // Save changes here 
      _manufacturerTypeRepository.Save(); 
     } 
    } 

Я также призываю Включать где я получаю ManufacturerType объект с Include («Производитель») ... поэтому я получаю текущий тип ManufacturerType, и метод TryUpdateModel также изменяет Title of ManufacturerType (если я его изменяю при редактировании в gridview), но Производитель всегда остается прежним ... Я также пытаюсь поместить dropdownlist в качестве элемента управления -параметр к методу UpdateMethod, например

public void UpdateItem(int manufacturerTypeId, [Control] manufacturerId, ModelMethodContext context) 

но это всегда значение null ... Поэтому я не знаю, как перевести значение из раскрывающегося списка на метод UpdateItem (UpdateItem не находится в коде производителя ManufacturerTypes.aspx, но он находится в логическом слое бизнес-процессов) ManufacturerTypeBL.cs .. .

I `t didn найти решение для этого, которые будут использовать новые функции, такие как ItemType в GridView и Select метода и SelectMethod в DropDownList и т.д ...

Может быть, мне нужно изменить метод UpdateItem со старым fasioned способом OnUpdating метод и прочитать значения из выпадающего меню и наложения на логический уровень бизнес-процессов с параметрами?

EDIT -> добавить модель классов (Производитель, ManufacturerType)

public class Manufacturer 
{ 
    [Key, ForeignKey("ManufacturerType")] 
    public int ManufacturerId { get; set; } 

    [StringLength(255)] 
    public string Title { get; set; } 

    public ManufacturerType ManufacturerType { get; set; } 
} 

public class ManufacturerType 
{ 
    [Key] 
    public int ManufacturerTypeId { get; set; }   

    [StringLength(50)] 
    public string Title { get; set; } 

    public Manufacturer Manufacturer { get; set; } 

} 
+0

Ваш груз из хранилища содержит правильный объект «Производитель»? – DrewJordan

+0

Да, объект «Производитель» не имеет значения null, но TryUpdateModel обновляет объект ManufacturerType, но не Производитель ... Я вижу, что MVC имеет метод TryUpdateModel с дополнительными параметрами, где вы можете установить, что вы хотите обновить некоторые другие объекты также (которые), но как насчет в webforms? Кажется, что мне нужно использовать другой подход для обновления Entity с отношениями ... Специальный метод обновления с параметрами обновления, установленными в OnItemUpdating, например ... – janilemy

ответ

0

Из того, что я могу понять,

В EditItemTempalte установлен SelectedValue =»<% # Bind ("ManufacturerId")%> ». то есть имя свойства для ManufacturerId в PropertyType Entity.

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

Если вы можете опубликовать свои классы моделей (Manufacturer and ManufacturerType), это будет более полезно для понимания проблемы.

+0

Я добавил классы моделей для лучшего понимания – janilemy