簡體   English   中英

從ViewModel編輯和保存。

[英]Editing and saving from a ViewModel.

這似乎是一個普遍的問題。 我看了很多例子,但是我肯定在某處缺少了一些東西。 下面是我的“ 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; }

}

控制器:

        // 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 Action上出現錯誤,該錯誤無法綁定到靜態對象。 我有些困惑,因為這種情況似乎可以解決該站點上的另一個問題。 在我看來,事實並非如此。 我必須在某處丟失一些東西。 謝謝你的幫助。

當您說addresses.IsBilling = EditAddressViewModel.IsBilling; 您正在詢問 EditAddressViewModel的屬性您要訪問對象 model的屬性。 所以我認為您需要addresses.IsBilling = model.IsBilling; 等等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM