【问题标题】:how to edit in asp.net mvc 5 using view model?如何使用视图模型在 asp.net mvc 5 中进行编辑?
【发布时间】:2014-10-13 06:53:36
【问题描述】:

我在 MVC 5 中的编辑和详细信息有问题我在我的应用程序中使用 ViewModel,这是我的 ViewModel 代码:

public class HeadsViewModel
{
    public int h_id { get; set; }
    public string h_no { get; set; }
    public string titles { get; set; }
    public string h_initials { get; set; }
    public string fname { get; set; }
    public string lname { get; set; }
    public string email { get; set; }
    public string cell { get; set; }
    public string tel_h { get; set; }
    public int title_id { get; set; }
    public string flatName { get; set; }
    public string flatNo { get; set; }
    public string strname { get; set; }
    public string strNo { get; set; }
    public string suburb { get; set; }
    public string city { get; set; }
    public string tel_w { get; set; }
    public string fax { get; set; }
    public string cell2 { get; set; }
    public bool active { get; set; }
    public string province { get; set; }
    public string country { get; set; }
    public int postalcode { get; set; }
    public string zone { get; set; }
    public bool isHa { get; set; }
    public int addtype { get; set; }
}

控制器:

    [HttpGet]
    public ActionResult Edit(int? id)
    {
        var member = (from h in db.Members
                      join j in db.Contacts on h.m_id equals j.m_id
                      join x in db.Addresses1 on h.phys_addid equals x.PhysAddID
                      join f in db.Titles on h.title_id equals f.title_id
                      where h.m_id == id
                      select new
                      {
                          title_id = h.title_id,
                          memType_id=h.Memtype_Id,
                          marital_id = h.maritialid,
                          m_id = h.m_id,
                          initials = h.initial,
                          fname = h.fname,
                          lname = h.lname,
                          dob = h.dob,
                          active= h.Active,

                          religion = h.religion,
                          occupation = h.occupation,
                          company = h.company,
                          note = h.Note,

                          employed = h.employed,
                          reg = h.reg_date,
                          accnumb = h.AccNumb,

                          agegroup = h.AgeGrp,
                          email = j.Email,
                          cell = j.cell,
                          cell2 = j.cell2,
                          tel_w = j.tel_w,
                          tel_h = j.tel_h,
                          fax = j.fax,
                          flatno = x.flatNo,
                          flatname = x.flatName,
                          strname = x.strname,
                          strno = x.strNo,
                          suburb = x.Suburb,
                          city = x.City,
                          province = x.Province,
                          country = x.Country,

                          zone = x.zone,
                          postalCode = x.PostalCode,


                      }).First();

        var viewmodel = new MembersViewModel();

        viewmodel.title_id = member.title_id;
        viewmodel.maritialid = (int)member.marital_id;
        viewmodel.m_id = member.m_id;
        viewmodel.Memtype_Id = (int)member.memType_id;

        viewmodel.initial = member.initials;
        viewmodel.fname = member.fname;
        viewmodel.lname = member.lname;
        viewmodel.dob = member.dob;
        viewmodel.active = (bool)member.active;
        viewmodel.religion = member.religion;
        viewmodel.occupation = member.occupation;
        viewmodel.company = member.company;
        viewmodel.note = member.note;

        viewmodel.regdate = member.reg;
        viewmodel.accNumb = member.accnumb;

        viewmodel.agegroup = member.agegroup;
        viewmodel.email = member.email;
        viewmodel.cell = member.cell;
        viewmodel.cell2 = member.cell2;
        viewmodel.tel_h = member.tel_h;
        viewmodel.tel_w = member.tel_w;
        viewmodel.fax = member.fax;
        viewmodel.flatName = member.flatname;
        viewmodel.flatNo = member.flatno;
        viewmodel.strname = member.strname;
        viewmodel.strNo = member.strno;
        viewmodel.suburb = member.suburb;
        viewmodel.city = member.city;
        viewmodel.province = member.province;
        viewmodel.country = member.country;



        try
        {


            viewmodel.postalcode = (int)member.postalCode;
        }
        catch (Exception) { }
        ViewBag.MaritialType = new SelectList(db.Maritials, "Maritialid", "MaritialType", viewmodel.maritialid);
        ViewBag.Type = new SelectList(db.MemberTypes.ToList(), "Memtype_Id", "Type", viewmodel.Memtype_Id);

        ViewBag.Titles = new SelectList(db.Titles.ToList(), "title_id", "Titles", viewmodel.title_id);

        return View(viewmodel);


    }


    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(MembersViewModel vm)
    {
           if (ModelState.IsValid)
        {



            var member = db.Members.Find(vm.m_id);
            var add = db.Addresses1.Find(vm.PhysAddID);
            var con = db.Contacts.Find(vm.m_id);






                member.title_id = vm.title_id;
                member.maritialid = (int)vm.maritialid;
                member.m_id = vm.m_id;
                member.Memtype_Id = (int)vm.Memtype_Id;

                member.initial = vm.initial;
                member.fname = vm.fname;
                member.lname = vm.lname;
                member.dob = vm.dob;
                member.Active = (bool)vm.active;
                member.religion = vm.religion;
                member.occupation = vm.occupation;
                member.company = vm.company;
                member.Note = vm.note;

                member.reg_date = vm.regdate;
                member.AccNumb = vm.accNumb;

                member.AgeGrp = vm.agegroup;



                con.Email = vm.email;
                con.cell = vm.cell;
                con.cell2 = vm.cell2;
                con.tel_h = vm.tel_h;
                con.tel_h = vm.tel_w;
                con.fax = vm.fax;
                add.flatName = vm.flatName;

                add.flatNo = vm.flatNo;
                add.strname = vm.strname;
                add.strNo = vm.strNo;
                add.Suburb = vm.suburb;
                add.City = vm.city;
                add.Province = vm.province;
                add.Country = vm.country;

                try
                {


                    add.PostalCode = (int)vm.postalcode;
                }
                catch (Exception) { }
                ViewBag.MaritialType = new SelectList(db.Maritials, "Maritialid", "MaritialType", vm.maritialid);
                ViewBag.Type = new SelectList(db.MemberTypes.ToList(), "Memtype_Id", "Type", vm.Memtype_Id);

                ViewBag.Titles = new SelectList(db.Titles.ToList(), "title_id", "Titles", vm.title_id);
                db.Entry(member).State = EntityState.Modified;
                db.Entry(add).State = EntityState.Modified;
                db.Entry(con).State = EntityState.Modified;

                db.SaveChanges();


                return RedirectToAction("Index");

        }

        return View(vm);

}

查看:

@model parishV3.Model.HeadViewModel

我的问题是 我想在我的编辑代码和详细信息代码上使用视图模型而不是表格。请你帮我处理代码。

现在获取编辑代码正在工作,但问题是发布编辑代码不起作用,请您帮忙。

【问题讨论】:

  • Head head = db.Heads.Find(id); 初始化您的视图模型的实例并将head 的属性映射到您的模型并返回它之后。 automapper 之类的工具可以提供帮助。另请注意,由于您有一个视图模型,它可能包含您的 SelectList 的属性。
  • 我在您的视图模型中看不到任何数据。您正在根据 id 编辑和获取详细信息。所以恐怕你只需要使用表格。
  • @mukund 所以你能帮我编写从 3 个不同表中获取数据的代码,如果是这样的话
  • 您可以使用 linq 查询通过连接从 3 个表中获取数据,然后创建 ViewModel 对象并设置属性。
  • 好的,我已经弄清楚问题出在哪里了...看来我无法获取需要更新的行的 ID,我知道这一点是因为我使用了断点和它告诉我 ID 为 0。当我在地址栏上键入 ID 时,它可以工作 (localhost:49230/Members/Edit/10)。请通过单击我的索引中的“编辑”链接帮助我找到一种方法。 @Mukund

标签: c# asp.net-mvc asp.net-mvc-viewmodel


【解决方案1】:

可能会有所帮助,请尝试以下操作。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Head head)
{
    if (ModelState.IsValid)
    {
        db.Entry(head).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
//Use automapper to map the objects or assign the data as below                 
    HeadViewModel headViewModel = new HeadViewModel {
    // Assign the property value from the table object 
    };
    ViewBag.title_id = new SelectList(db.Titles, "title_id", "Titles", head.title_id);
    return View(headViewModel);
}

[HttpGet]
public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Head head = db.Heads.Find(id);
    if (head == null)
    {
        return HttpNotFound();
    }

//Use automapper to map the objects or assign the data as below                 
HeadViewModel headViewModel = new HeadViewModel {
    // Assign the property value from the table object
    };
    return View(headViewModel);
}

要使用三个不同的表,您必须修改您的 viewModel,例如,

public class HeadViewModel
{
    public Table1 Table1 { get; set; }
    public Table2 Table2 { get; set; }
    public Table3 Table3 { get; set; }
}

public class Table1
{
    public int column1 { get; set; }

    public string column2 { get; set; }
}

public class Table2
{
    public int column1 { get; set; }

    public string column2 { get; set; }
}

public class Table3
{
    public int column1 { get; set; }

    public string column2 { get; set; }
}

在控制器中绑定数据时,如下操作,

        HeadViewModel headViewModel = new HeadViewModel
        {
            Table1 = new Table1
            {
                column1 = 0, // you data from the DB table object
                column2 = ""// you data from the DB table object
            },
            Table2 = new Table2
            {
                column1 = 0, // you data from the DB table object
                column2 = ""// you data from the DB table object
            },
            Table3 = new Table3
            {
                column1 = 0, // you data from the DB table object
                column2 = ""// you data from the DB table object
            }
        };
        return View(headViewModel);

更新
您似乎在 post 方法上返回了 3 个视图模型,这肯定是不可能的,而您必须使用绑定到视图的视图模型。

绑定到视图“Edit”的视图模型是“MembersViewModel”,因此您的 Post 操作方法应如下所示,

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(MembersViewModel members)
{
   // From here you may want to again map the data from MembersViewModel to the table objects and do the rest of operation as you have done below
   // 1. Get the data table objects
   // 2. Assign the data from the MembersViewModel to the respective data tables which is similarly done in [HttpGet] method.
   // 3. Then save the changes as below.
        db.Entry(member).State = EntityState.Modified;
        db.Entry(add).State = EntityState.Modified;
        db.Entry(con).State = EntityState.Modified;
        db.SaveChanges();
}

10 月 20 日更新 而不是写作,

db.Entry(member).State = EntityState.Modified;

试试下面的,

db.EntityClass.Attach(member);
db.ObjectStateManager.ChangeObjectState(member, EntityState.Modified);

这里的EntityClass是为成员自动生成的类。对其他表也这样做。

【讨论】:

  • @venkatesh 当您想在 3 个不同的表格中进行编辑时,如何在 POST ACTION CODE 上显示这些表格?
  • 检查修改后的答案并根据您的要求修改模型。
  • Venkant 你能检查一下我更新的代码吗?
  • @venkant “从这里您可能想再次将 MembersViewModel 中的数据映射到表对象并按照您在下面所做的那样执行其余操作”您能否在此处展开​​您的解释,因为我不能立即行动。
  • @sibonile 我已经简要介绍了你问我是否理解正确的事情。查看更新的答案。
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多