如何在同一模型的视图中使用局部视图?

时间:2015-04-28 08:44:11

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 partial-views

我有一个简单的表单,具有以下功能。

  1. 第一部分:它有一个表格,它将显示数据库表格中的值,例如: tblProfile,它包含三列,如profileid, profilename, description,每行包含一个编辑按钮,用于编辑值。

  2. 第二部分:在同一页面中,我有三个文本框,用于输入同一数据库表的值,例如: tblProfile。单击提交按钮后,它会将值插入表格中,并立即显示在上述表格中,并根据上一个profileid显示profileid文本框中的前+ 1个ID 。如果在表格上单击任何编辑按钮,则将使用这些值填充这三个文本框。修改后,他们必须更新。

  3. 我创建了一个使用IEnumerable<MyModel>作为模型的视图,以便所有配置文件值都显示在表格中(强类型视图)。现在,对于表单部分,我创建了一个局部视图,它也是一个强类型视图,但它使用IEnumerable<MyModel>代替MyModel作为模型类型。

    我很困惑我应该在哪里放置保存,更新,取消等按钮:在主视图或部分中。如何完成功能?我在主解决方案中使用VS2010 SP1和MVC4和EF,它有一个MVC项目,两个文件夹:BusinessLayer和DataAccesLayer。 BusinessLayer文件夹包含BO和BA的单独类库,DataAccesLayer文件夹包含一个类库文件,另外两个文件夹用于EF .edmx文件,另一个用于DA类。

    我该如何实现?

    enter image description here

1 个答案:

答案 0 :(得分:2)

简单方法:创建一个部分视图以添加新记录,另一个部分视图用于更新现有记录。这种方法的原因是分离您的后期处理应如何处理您的请求的问题。除非您添加bool标志来告诉操作是否要插入或更新post命令,否则它将不知道如何处理数据。所以,我建议创建单独的部分

// Insert partial "InsertPartialView"
@YourApp.Models.MyModel

@using (Html.BeginForm("InsertNewRecord", "Home"))
{
  // your field controls here

  <input type="submit" value="Add" />
}
// Update partial "UpdatePartialView"
@YourApp.Models.MyModel

@using (Html.BeginForm("UpdateRecord", "Home"))
{
  // your field controls here

  <input type="submit" value="Update" />
}

在您的控制器中,使用&#34; InsertNewRecord&#34;添加新记录的操作,以及&#34; UpdateRecord&#34;用于更新现有记录。

最初,您可以使用&#34;插入&#34;部分显示在您的视图中,因此添加记录不需要为此部分视图提供服务。

<div id="partialDiv">
  @Html.Partial("InsertPartialView")
</div>

现在,当您想要更新记录时,您需要拨打服务器以替换您的&#34;插入&#34;部分与&#34;更新&#34;部分。您可以通过创建&#34;编辑&#34; ajax-action链接,用于容纳表中的每条记录:

@Ajax.ActionLink("Edit", "GetUpdatePartial", new { id = item.profileid }, new AjaxOptions { HttpMethod = "GET", InsertionMode = InsertionMode.Replace, UpdateTargetId = "partialDiv" })
如果您之前从未使用过ajax链接,我会解释这个问题。前三个参数是链接的文本,动作的名称和项目的ID - 与常规的Html-actionlink没有什么不同。第四个参数让我们定义我们的ajax选项。 &#34; GET&#34;方法是不言自明的 - 我们不处理此调用的任何数据,只从数据库中检索。 InsertionMode选项定义了如何在View中处理返回数据。在这种情况下,我们希望它替换当前的&#34;插入&#34;局部视图,所以我们选择&#34;替换&#34;。最后,我们定义了我们希望插入局部视图的元素,我们命名为&#34; partialDiv&#34;。

此时,唯一缺少的是我们的ajax调用操作。

[HttpGet]
public PartialViewResult GetUpdatePartial(int id)
{
  var record = db.tblProfile.Single(r => r.profileid == id);

  return PartialView("UpdatePartialView", record);
}

此操作使用&#34;编辑&#34;中的profileid。 ajax-link从db中检索其记录,然后我们以记录作为模型返回部分视图。结果应该是这个局部视图现在将插入我们的&#34; partialDiv&#34;,替换初始&#34;插入&#34;部分观点。

如果您需要,可以执行以下其他操作:

[HttpPost]
public ActionResult InsertNewRecord(MyModel model)
{
  if (model.IsValid)
  {
    db.tblProfile.Add(model);
    db.SaveChanges();
  }

  return RedirectToAction("Index");
}
public ActionResult UpdateRecord(MyModel model)
{
  if (model.IsValid)
  {
    db.Entry(model).State = EntityState.modified;
    db.SaveChanges();
  }

  return RedirectToAction("Index");
}

希望有所帮助