Данные модели MVC не являются обязательными - PullRequest
0 голосов
/ 01 октября 2019

Я создал форму, чтобы добавить клиента. Я сделал страницу клиента с помощью Viewmodel. Просмотрите класс модели следующим образом:

public class CustomerViewModel
{
    public IEnumerable<MemberShipType> MemberShipTypes { get; set; }
    public Customer Customers { get; set; }
}  

public class Customer
{
    [Display(Name ="Customer ID")]
    public int CustomerId { get; set; }

    [Required(ErrorMessage = "Please enter customer name")]
    [StringLength(255)]
    [Display(Name ="Customer Name")]
    public string CustomerName { get; set; }

    public MemberShipType MemberShipType { get; set; }

    [Required(ErrorMessage = "Please select membership type")]
    [Display(Name = "Membership Type")]
    public byte MembershipTypeId { get; set; }
}

public class MemberShipType
{
    [Display(Name ="Membership Id")]
    public byte Id { get; set; }
    [Required]
    [Display(Name = "Subscription Plan")]
    public string Name { get; set; }
}

После добавления этого класса мы создали действие для сохранения данных формы клиента с использованием одного класса модели (не viewModel)

Я создал форму клиента с помощьюViewmodel для отображения с данными типа членства.

Интерфейс прекрасно отображается с помощью приведенного ниже кода. Но я не могу получить данные модели в методе действия.

Если я напрямую использую модель представления в данных действия, это нормально. Проблема должна сопоставить все свойства модели представления с конкретной моделью.

Требуется больше времени для сопоставления свойств модели каждый раз.

Может ли кто-нибудь знать, как напрямую использовать метод добавления структуры объекта с клиентской моделью (модель не для просмотра)

@using (Html.BeginForm("Save", "Customer", FormMethod.Post))
{
    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

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

        <div class="form-group">
            @Html.LabelFor(m => m.Customers.MembershipTypeId, htmlAttributes: 
             new { @class = "control-label col-md-2" })
            <div class="col-lg-10">

                @Html.DropDownListFor(m => m.Customers.MembershipTypeId,
                    new SelectList(Model.MemberShipTypes, "Id", "Name"), 
                    "Please Select", new {@class = "form-control"})

                @Html.ValidationMessageFor(m => m.Customers.MembershipTypeId, 
                    "", 
                    new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-lg-10 col-lg-offset-2">
                <input type="reset" value="Reset" class="btn btn-default" />
                <button type="submit" class="btn btn-primary">Save</button>    
            </div>
        </div>

    </div>
}

Модель действий ниже всегда возвращает нуль.

        [System.Web.Mvc.HttpPost]
        public ActionResult Save(Customer customer)
        {
            if (customer.CustomerId == 0)
            { 
              _context.Customer.Add(customer);
              _context.SaveChanges();
            }
        }

Я получаю, что модель Customer является нулевой. Если я передам customerViewModel данные поступают. Может кто-нибудь знает ответ о том, как напрямую получить данные в классе модели?

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Поскольку вы привязываете представление к модели CustomerViewModel и используете редактор HTMLFor помощников (лямбда-перегрузка), вы должны ожидать, что эта же модель взамен вашего POST. Когда вы используете LabelFor и EditorFor, автоматическое именование, вероятно, даст вам что-то вроде «Customers_CustomerName», поэтому оно может снова собрать вашу модель представления.

Одним из решений является изменение ожидаемой модели в вашем методе сохранения на «CustomerViewModel» и просто использование свойства .Customer для получения данных.

[System.Web.Mvc.HttpPost]
        public ActionResult Save(CustomerViewModel model)
        {
            if (model.Customer.CustomerId == 0)
            { 
              _context.Customer.Add(model.Customer);
              _context.SaveChanges();
            }
        }

Другой вариант - указать поля ввода вручную, чтобы они напрямую отражали свойства модели «Клиент», и она отобразит их в модель «Клиент» для вас в POST. Например, вместо @ Html.LabelFor (m => m.Customers.CustomerName вы просто используете @ Html.EditorFor ("CustomerName", Model.Customers.CustomerName)

<div class="form-group">
            @Html.LabelFor(m => m.Customers.CustomerName, htmlAttributes: 
            new { @class = "control-label col-md-2" })
            <div class="col-md-10">
 *********EDIT HERE      --> @Html.TextBox("CustomerName", Model.Customers.CustomerName
                new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(m => m.Customers.CustomerName, "", 
                new { @class = "text-danger" })
            </div>
        </div>
0 голосов
/ 11 октября 2019

Я получил решение для этой проблемы. Причина проблемы в том, что я создал контроллер и модель с одним и тем же именем. Итак, я изменил имя модели с другим псевдонимом в Viewmodel, как показано ниже:

public class CustomerViewModel 
{ 
    public IEnumerable<MemberShipType> MemberShipTypes 
    { get; set; } 
    public ProductionCustomer productionCustomers 
    { get; set; }
}  

Если мы используем объект модели в контроллере для Get / POST, он будет работать, даже если мы визуализировали форму с помощью ViewModel (Multiple Model)). По умолчанию mvc идентифицирует модель для публикации в форме.

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