正确的POST数据MVC方式

时间:2013-06-18 16:40:57

标签: c# asp.net-mvc http-post

警告:这是我的第一个网络应用。

我有4个型号,视图和控制器。让我们称他们为A,B,C,D(例如ModelA,ControllerA,ViewA)。它们都是列表脚手架的基本视图。

/ControllerA/Index

用户从ViewA开始并选择第一个项目,将用户重定向到ViewB

/ControllerB/Function?Aid=1

ViewB根据ViewA中的Selection显示另一个列表。然后用户再次选择被重定向到ViewC

/ControllerC/Function?Aid=1&Bid=2

ViewC根据ViewA和ViewB中的选择显示另一个列表。然后用户再次选择被重定向到ViewD。

/ControllerD/Function?Aid=1&Bid=2&Cid=3

ViewD根据ViewA,ViewB和ViewC中的选择显示另一个列表,然后用户再次选择。

此时我想发布Aid,Bid,Cid和Did,并将它们保存在我的数据库中。理想情况下,用户会点击链接,数据将被发布,然后网站会将用户重定向回主页。我应该创建另一个模型和控制器来处理帖子吗?我想过尝试从controllerD做POST,但这似乎不是正确的方法。

msdn教程仅显示直接从具有强类型模型的视图发布。我有点卡住了,我宁愿不要把它弄得一团糟。

编辑代码 控制器

  public ActionResult myFunction(int Aid = 0, int Bid, int Cid)
        {

           //query D stuff here


            if (D == null)
            {
                return HttpNotFound();
            }
            return View(D.ToList());



        }

        [HttpPost]
        [InitializeSimpleMembership]
        public ActionResult CreateQuote(int Aid, int Bid, int Cid, int Did)
        {
            Quote myQuote = new Quote();
            myQuote.Customer_ID_FK = (int)Membership.GetUser().ProviderUserKey;
            myQuote.A_ID_FK = Aid;
            myQuote.B_ID_FK = Bid;
            myQuote.C_ID_FK = Cid;
            myQuote.D_ID_FK = Did;

            if (ModelState.IsValid)
            {
                db.Quotes.Add(myQuote);
                db.SaveChanges();
                db.Quotes.Max();
                int mymax = db.Quotes.Max(q => q.ID);


                return RedirectToAction();

            }


            return View(D.ToList());
        }
        [HttpPost]
        [InitializeSimpleMembership]
        public ActionResult CreateQuote(Quote myQuote)
        {
            myQuote.Customer_ID_FK = (int)Membership.GetUser().ProviderUserKey;
            if (ModelState.IsValid)
            {

                db.Quotes.Max();
                int mymax = db.Quotes.Max(q => q.ID);
                db.Quotes.Add(myQuote);
                db.SaveChanges();

                return RedirectToAction();

            }

            return View(D.ToList());
        }

1 个答案:

答案 0 :(得分:1)

将帖子处理程序放在与其相关的控制器中通常是有意义的。情况并非总是如此,因为有时创建一个新的控制器来处理与某个任务相关的所有帖子会更有意义。您还应该了解控制器中的方法和控制器之间的区别。控制器只是一个继承自System.Web.Mvc.Controller的类,可以像任何其他类一样拥有方法。一个完全合理的控制器可能如下所示:

public class DController : Controller
{

    //GET /d
    public ActionResult Index()
    {
        //MyModel is a class that would contain the logic to display
        //the selections from A, B, and C
        var model = new MyModel();
        return View(model);
    }

    //POST /d/saveresults
    //We only want this method to accept POST
    [HttpPost]
    public ActionResult SaveResults(MyEntity data)
    {
        var model = new MyModel();
        model.SaveResultsToDatabase(data);

        return Redirect("/");
    }
}

控制器中最重要的是将逻辑处理保持在最低限度。在这里和那里使用if语句没有任何问题,但是你的大多数逻辑应该由你的模型处理。控制器主要用于在视图和模型之间传递数据。