asp.net mvc如何使用模型(在post控制器中更新)

时间:2016-06-20 14:18:02

标签: asp.net asp.net-mvc

我是mvc的新手,我正在努力解决这个模型问题。 我的理解是每个动作我只能使用一个模型。

public class TestModel
{
    public string foo1 { get; set; }
    public string foo2 { get; set; }
    public string foo3 { get; set; }
}

我想在正常操作中部分加载我的模型:

    public ActionResult Index()
    {
        TestModel model = new TestModel();
        model.foo1 = "foo1";
        return View(model);
    }

然后,用户应该从视图中向模型添加数据。

@model SAS_MVC.Models.Test.TestModel

@using (Html.BeginForm())
{
   @Html.EditorFor(model => model.foo1, new { htmlAttributes = new { @class = "form-control" } })
   @Html.EditorFor(model => model.foo2, new { htmlAttributes = new { @class = "form-control" } })
   @Html.EditorFor(model => model.foo3, new { htmlAttributes = new { @class = "form-control" } })

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

根据用户的数据,我必须在后置控制器中添加更多数据:

    [HttpPost]
    public ActionResult Index(MyModel model, FormCollection form)
    {
        // get some data from DB

        model.foo3 = 123;
        return View(model);
    }

如何永久保存此模型?我有问题,例如foo3在视图中为空。我想在后控制器和视图之间传递模型几次而不会丢失数据。

我确实尝试过使用TempData和ViewBag,但对我而言,这对于使用...没有intellisense非常不舒服。

那我该怎么办呢?谢谢你的帮助!

使用EF6更新:

public class MyEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class TestController : Controller
{
    DB03SASModel dbModel = new DB03SASModel();

    // GET: Test
    public ActionResult Index()
    {
        MyEntity model = new MyEntity();
        model.Name = "AAAA";
        dbModel.MyEntities.Add(model);
        dbModel.SaveChanges();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyEntity model)
    {
        model.Name = "BBBB";
        dbModel.SaveChanges();
        //UpdateModel(model);
        return View(model);
    }
}

查看

@model SAS_MVC.MyEntity

@using (Html.BeginForm())
{
  @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
  @Html.DisplayFor(model => model.Id, new { htmlAttributes = new { @class = "form-control" } })
  @Html.HiddenFor(model => model.Id, new { htmlAttributes = new { @class = "form-control" } })


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

现在我使用EF Code First保存模型,然后在DB中检查它 - &gt;一切都得到了很好的保存。 但是:观点再次采取了错误的价值,我仍然在努力。 我发现@Html.HiddenFor为我提供了后控制器中实体的当前ID。比我将值更改为“BBBB”,而不是将完全相同的实体传递回视图,但视图从未进行过更新! 我不后悔。当我尝试使用UpdateModel(模型); “AAAA”再次是我的价值!这个价值来自哪里?在DB中,此时没有这样的值!!我错了什么?

1 个答案:

答案 0 :(得分:0)

保存模型应该在post操作中发生,并永久保存模型,因此您应该将其保存到数据库,这需要您将模型映射到数据库表,为此,您应该创建一个数据库和创建一个保存模型数据的表,然后使用Entity框架或任何其他ORM将模型映射到数据库表。

更新1:

您将模型保存到数据库中的两个位置,首先是get动作,然后是post动作,所以每次保存&#34; BBB&#34;在post动作中,它将在get动作中被覆盖到&#34; AAAA&#34;,所以这里是你的代码应该如何:

public class TestController : Controller
{
    TestEntities dbModel = new TestEntities();

    public ActionResult Index(int? id)
    {
        MyEntity model = new MyEntity();
        if (id.HasValue)
            model = dbModel.MyEntity.First(m => m.Id == (id ?? 0));

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyEntity model)
    {
        dbModel.MyEntity.Add(model);
        dbModel.SaveChanges();

        return RedirectToAction("Index", new { id = model.Id });
    }
}

如果您看到只在post操作中将数据保存到数据库,则get操作是从数据库中恢复数据。