Редактирование и сохранение из ViewModel. - PullRequest
0 голосов
/ 09 декабря 2018

Кажется, это общий вопрос.Я посмотрел на множество примеров, но я должен что-то упустить.Ниже приведен мой код для «ViewModel» и «Controller».

ViewModel:

    public class EditAddressViewModel
{
    public Guid AddressUI { get; set; }
    [Display(Name = "Billing Address?")]
    [UIHint("_IsStatus")]
    public bool IsBilling { get; set; }
    [Display(Name = "Shipping Address?")]
    [UIHint("_IsStatus")]
    public bool IsShipping { get; set; }
    [Display(Name = "Location Name")]
    public string LocationName { get; set; }
    [Display(Name = "Contact Name")]
    public string ContactName { get; set; }
    [Display(Name = "Address")]
    public string Line1 { get; set; }
    [Display(Name = "Address 2")]
    public string Line2 { get; set; }
    [Display(Name = "Country")]
    public int Country { get; set; }
    [Display(Name = "State")]
    public int State { get; set; }
    [Display(Name = "City")]
    public int City { get; set; }
    [Display(Name = "ZipCode")]
    public string ZipCode { get; set; }
    [Display(Name = "Contact Email")]
    [DataType(DataType.EmailAddress)]
    [StringLength(320)]
    [RegularExpression(@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", ErrorMessage = "Enter a valid email address")]
    public string EmailAddress { get; set; }
    [Display(Name = "Phone Number")]
    [DataType(DataType.PhoneNumber)]
    [StringLength(12)]
    [RegularExpression(@"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}", ErrorMessage = "Enter a valid phone number")]
    public string PhoneNumber { get; set; }
    [Display(Name = "Fax Number")]
    [DataType(DataType.PhoneNumber)]
    [StringLength(12)]
    [RegularExpression(@"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}", ErrorMessage = "Enter a valid phone number")]
    public string FaxNumber { get; set; }
    public int CompanyId { get; set; }

    [Display(Name = "Select Country")]
    public int CountryId { get; set; }
    public IEnumerable<SelectListItem> Countries { get; set; }

    [Display(Name = "Select State")]
    public int StateId { get; set;  }
    public IEnumerable<SelectListItem> States { get; set; }

    [Display(Name = "Select Cit;y")]
    public int CityId { get; set; }
    public IEnumerable<SelectListItem> Cities { get; set; }

}

Controller:

        // Customer Input
    // GET: Addresses/Edit/5
    [Authorize(Roles = "CompanyAdmin")]
    public ActionResult UserEdit(Guid guid)
    {
        if (guid == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Addresses addresses = db.Addresses.Find(guid);
        if (addresses == null)
        {
            return HttpNotFound();
        }

        EditAddressViewModel editAddress = new EditAddressViewModel()
        {
            AddressUI = addresses.AddressUI,
            LocationName = addresses.LocationName,
            Line1 = addresses.Line1,
            Line2 = addresses.Line2,
            Country = addresses.Country,
            State = addresses.State,
            City = addresses.City,
            ZipCode = addresses.ZipCode,
            PhoneNumber = addresses.PhoneNumber,
            FaxNumber = addresses.FaxNumber,
            CompanyId = addresses.CompanyId
        };
        ConfigureViewModel(editAddress);
        return View(editAddress);
    }

    public void ConfigureViewModel(EditAddressViewModel editAddressViewModel)
    {
        editAddressViewModel.Countries = db.Countries.Select(o => new SelectListItem()
        {
            Value = o.CountryId.ToString(),
            Text = o.CountryName
        });

        editAddressViewModel.States = db.States.Select(o => new SelectListItem()
        {
            Value = o.StateId.ToString(),
            Text = o.StateName
        });

        editAddressViewModel.Cities = db.Cities.Select(o => new SelectListItem()
        {
            Value = o.CityId.ToString(),
            Text = o.CityName
        });
    }

    // POST: Addresses/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult UserEdit(EditAddressViewModel model)
    {
        var userId = User.Identity.GetUserId();
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        Addresses addresses = db.Addresses.Find(model.AddressUI);
        addresses.IsBilling = EditAddressViewModel.IsBilling;
        addresses.IsShipping = EditAddressViewModel.IsShipping;
        addresses.LocationName = EditAddressViewModel.LocationName;
        addresses.Line1 = EditAddressViewModel.Line1;
        addresses.Line2 = EditAddressViewModel.Line2;
        addresses.Country = EditAddressViewModel.Country;
        addresses.State = EditAddressViewModel.State;
        addresses.City = EditAddressViewModel.City;
        addresses.ZipCode = EditAddressViewModel.ZipCode;
        addresses.PhoneNumber = EditAddressViewModel.PhoneNumber;
        addresses.FaxNumber = EditAddressViewModel.FaxNumber;
        addresses.CompanyId = EditAddressViewModel.CompanyId;

        db.Entry(addresses).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index", "Customer", new { UserId = userId });

    }

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

addresses.IsBilling = EditAddressViewModel.IsBilling;

показывают, что «Ссылка на объект требуется для нестатического поля, метода или свойства».Если я перехожу к своей 'ViewModel' и изменяю "public int или string" на "public static int", то он исчезает, но затем я получаю ошибку в действии get, которая не может быть привязана к статическому объекту.Я немного сбит с толку, потому что этот же сценарий работает для другого вопроса на этом сайте.По моему это не так.Я должен что-то упустить где-то.спасибо за вашу помощь.

1 Ответ

0 голосов
/ 09 декабря 2018

Когда вы говорите addresses.IsBilling = EditAddressViewModel.IsBilling;, вы запрашиваете свойство класса EditAddressViewModel. Вы хотите получить доступ к свойству объекта model.Так что я думаю, что вы хотите addresses.IsBilling = model.IsBilling; и т. Д.

...