Вопрос:

Передача нескольких объектов класса в бритву через контроллер в mvc, asp.net

c# asp.net-mvc inheritance

657 просмотра

1 ответ

7 Репутация автора

Я пытаюсь выполнить операции CRUD на двух классах PurchaseDetailи ItemDetail. Сделал PurchaseDetailбазовый класс и ItemDetailкак дочерний класс. Таким образом, с одной точки зрения, я передаю объект дочернего класса. Теперь, когда я выполняю операцию CRUD на дочернем классе, все работает нормально. Но при попытке сделать то же самое с базовым классом, я получаю нулевой объект при добавлении данных, вызывая create (ItemDetail obj) в HttpPost.

Любое решение для этого? Является ли хорошей практикой передача нескольких классов в представление с использованием наследования?

Редактировать разработку:

public class PurchaseDetail
{
    public int ID { get; set; }

    [Required]
    [Display(Name = "PPRF Name")]
    public string pprfName { get; set; }
    public int DepartmentID { get; set; }

    [Display(Name ="Department")]
    public string DepartmentName { get; set; }
    public int DepartmentSerial { get; set; }
    public List<SelectListItem> MaterialTypes { get; set; }

Выше класса мой базовый класс с несколькими свойствами. Тогда ниже мой детский класс.

public class ItemDetail: PurchaseDetail
{
    public int ItemID { get; set; }
    public int ItemCategoryID { get; set; }
    public string ItemCategoryName { get; set; }
    public int ProductID { get; set; }

Если бы я взял оба на разных страницах, не было никаких проблем. Но я хочу передать оба класса одному и тому же виду, поэтому я пошел на Наследование. Я выскакиваю форму для ItemDetail из того же представления, чтобы добавить элемент.

@model AIIMSINTRANET.Models.ItemDetail

Сначала я вставляю ItemDetail с помощью вызова Ajax. Здесь все работает нормально.

public JsonResult Add(ItemDetail item)
{ 
    //Insert Logic
}

После этого я хочу вставить PurchaseDetail в соответствующую таблицу. Поскольку представление было таким же, поэтому все поля, такие как TextBox, выпадающие были заполнены при вызове этого метода.

 public ActionResult Create()
    {
        ItemDetail obj = new ItemDetail(); 

        obj.DeptIndentNo = GetIndentNumber2();
        obj.IndentDate = DateTime.Now.Date;
        obj.MaterialTypes = PurchaseProposalDO.PopulateMaterialType();
        //Initialized all other fields 
     }

Даже поля, такие как DropDown класса ItemDetail, заполняются во время вызова функции выше. Теперь, когда я отправляю форму в Insert PurchaseDetail, она вызывает функцию ниже:

    [HttpPost]
    public ActionResult Create(ItemDetail obj)
    {
        // Insert Logic Here
    }

Теперь вот моя проблема. Почему я получаю объект как ноль? Даже когда я все ввожу.

<div class="form-group">
        @Html.LabelFor(model =>model.pprfName, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model =>model.pprfName, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.pprfName, "", new { @class = "text-danger" })
        </div>
    </div>

Пожалуйста помоги.

Автор: chandrabhan Источник Размещён: 08.11.2017 11:52

Ответы (1)


0 плюса

13171 Репутация автора

Не видя определения классов, о которых идет речь, трудно ответить однозначно, но, похоже, у вас есть отношение типа Заголовок заказа / Строка заказа. Если это так, использование наследования является абсолютно неправильным подходом для решения этой проблемы. Вы должны использовать модель представления, которая инкапсулирует два других объекта и передает их. Что-то вроде:

public class OrderViewModel
{
    public PurchaseDetail PurchaseDetail { get; set; }
    public ItemDetail ItemDetail { get; set; }
}

Или, если может быть много ItemDetails для одного PurchaseDetail:

public class OrderViewModel
{
    public PurchaseDetail PurchaseDetail { get; set; }
    public IEnumerable<ItemDetail> ItemDetails { get; set; }
}

В качестве альтернативы, вы можете сделать так, чтобы модель представления передавала только свойства, представляющие интерес для представления. Опять же, не видя определения классов, трудно быть более конкретным.

Автор: Craig W. Размещён: 09.11.2017 12:58
Вопросы из категории :
32x32