Что на самом деле делает Html .HiddenFor ()? - PullRequest
0 голосов
/ 01 августа 2020

Html .HiddenFor () используется, когда я хочу сохранить поле на странице, но не хочу, чтобы пользователь его заметил, например поле Id и т. Д., Но инициализирует ли оно значение для поля Id? Если в поле Id уже есть значение, что тогда оно делает? В настоящее время я изучаю курс ASP. Net MVC, и я реализую контроллер, который редактирует и создает новых клиентов. Для этого я передаю viewModel своему контроллеру и проверяю, имеет ли мой объект Customer в этой viewModel идентификатор, который не равен 0, если он равен 0, то это новый клиент, который мне нужен чтобы добавить в мою базу данных, иначе мне нужно отредактировать его, поскольку он действительно присутствует в моей базе данных. Итак, что в этом случае делает Html .HiddenFor ()? Если я удалю тег Html .HiddenFor () из своего представления, когда я редактирую клиента, вместо того, чтобы редактировать его, он создает нового клиента. Это почему? У клиента, которого я редактирую, уже есть идентификатор, который является ключом в моей базе данных, поэтому почему его идентификатор был обработан как 0 в моем контроллере, и что ДЕЙСТВИТЕЛЬНО делает Html .HiddenFor ()? Я видел вопросы о HiddenFor раньше и читал документацию, но все еще не могу понять, что он на самом деле делает, особенно когда действительно есть поле со значением, отличным от 0 (поле Id)

My Customer Class:

public class Customer
    {
        public int Id { get; set; }


        [Required] //means that it wont be nullable
        [StringLength(255)] //max len 255 instead of inf 
        public string Name { get; set; }


        public bool IsSubscribedToNewsletter { get; set; }


        [Display(Name = "Membership Type")]
        public MembershipType MembershipType { get; set; }  //navigation property, allows us to navigate from one type to another


        [Display(Name = "Membership Type")]

        public byte MembershipTypeId { get; set; } //foreign key of membership object for optimization purposes
        

        [Display(Name = "Date of Birth")]
        public DateTime? Birthdate { get; set; }  //nullable 
    }

Метод сохранения в моем CustomersController

 [HttpPost]  //make sure not httpget, if modify data, never let it be httpget
        public ActionResult Save(CustomerFormViewModel viewModel) //or use updatecustomerdto (small class we create with only properties we want to update
        {
            if (viewModel.Customer.Id == 0)
            {
                _context.Customers.Add(viewModel.Customer);
            }
            else
            {
                Customer customerInDb = _context.Customers.Single(c => c.Id == viewModel.Customer.Id); //customer object in db
                                                                                                       //need to update its properties to be like those in viemodelcustomer

                //TryUpdateModel(customerInDb,"",new string[] { "Name", "Id" }); //dont use this approach since security conecerns
                //name id is whitelisted as the only things to be updated
                //OR
                //Mapper.Map(customer, customerInDb)

                customerInDb.Name = viewModel.Customer.Name; 
                customerInDb.Birthdate = viewModel.Customer.Birthdate;
                customerInDb.MembershipTypeId = viewModel.Customer.MembershipTypeId;
                customerInDb.IsSubscribedToNewsletter = viewModel.Customer.IsSubscribedToNewsletter;

            }

            _context.SaveChanges(); //must save changes after creating a change in the database

            return RedirectToAction("Index", "Customers");
        }

My CustomerFormView, где элемент Html .HiddenFor находится в строке перед последней

@model VidlyProject.ViewModels.CustomerFormViewModel

@{
    ViewBag.Title = "New";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>New Customer</h2>

@using (Html.BeginForm("Save", "Customers"))
{
    <!--we surround it in using since beginform creates a <form> tag not </form> so we need to close it afterwards-->
    <div class="form-group">
        <!--bootstrap class for a responsive form-->
        @Html.LabelFor(m => m.Customer.Name) <!--label-->
        @Html.TextBoxFor(m => m.Customer.Name, new { @class = "form-control" }) <!--next paramter is an anonymous object, where each element is rendered as an html attribute-->
        @**\@class not class because class is reserved in c#-->**@
    </div>

    <div class="form-group">
        @Html.LabelFor(m => m.Customer.Birthdate)
        @*OR <lable for="Birthdate">Date Of Birth</label>*@
                                                    @*format string to format the date *@
        @Html.TextBoxFor(m => m.Customer.Birthdate, "{0: d MMM yyyy}", new { @class = "form-control" })
    </div>

    <div class="form-group">
        @Html.LabelFor(m => m.Customer.MembershipTypeId)
        @Html.DropDownListFor(m => m.Customer.MembershipTypeId, 
                              new SelectList(Model.MembershipTypes, @*initialize a drop down list*@
                              "Id", @*Name of property in membershiptype class that holds the value for each item*@
                              "Name"), @*Property that holds the text of each item*@
                              "Please select a membership type", @*message at the beginning of the dropdown*@
                              new { @class = "form-control"})
    </div>

    <div class="checkbox">
        <label>
            @Html.CheckBoxFor(m => m.Customer.IsSubscribedToNewsletter, new { @class = "form-check-input" }) Subscribed to the Newsletter?
        </label>
    </div>
    @Html.HiddenFor(c => c.Customer.Id) <!--so that we set an id and the id isnt zero-->
    <button type="submit" class="btn btn-primary">Save</button>
    
}

1 Ответ

1 голос
/ 01 августа 2020

Давайте изучим небольшой алгоритм здесь Предположим, вы работаете на стойке регистрации в отеле и ваша обязанность - сообщать о посетителях в отеле и выходе из него. Теперь в вашем отеле, когда к вам приходит клиент, вы просите его регистрационную карточку. Если у клиента его нет, то вы точно знаете, что наступает его новое время. В этом случае вы должны зарегистрировать его как нового пользователя. Если он уже сделал это, вы откроете его запись и отметите время входа и времени ожидания. Теперь приходит клиент и утверждает, что он уже зарегистрирован. Вы просматриваете записи, но карта, которую он представил, была поддельной, выданной другому клиенту, или, что еще хуже, идентификатор этой карты отсутствует в ваших записях. У вас не останется выбора, кроме как выполнить новую регистрацию для этого пользователя.

Проблема здесь в том, что пользователь не представил Id-карту или Id-карта была ложной. Если вы не поставите Html.LabelFor, не будет поля для хранения предыдущего идентификатора, который был выдан пользователю

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