正确的方式POST数据MVC
本文关键字:数据 MVC POST 方式 | 更新日期: 2023-09-27 18:18:51
警告:这是我的第一个web应用。
我有4个模型,视图和控制器。我们称它们为A, B, C, D。模型a、控制器a、视图a)。它们都是带有列表脚手架的基本视图。
/ControllerA/Index
用户从ViewA开始并选择第一个项目,它将用户重定向到ViewB
/ControllerB/Function?Aid=1
ViewB显示了另一个基于ViewA选择的列表。然后用户再次选择它被重定向到ViewC
/ControllerC/Function?Aid=1&Bid=2
ViewC显示了基于ViewA和ViewB的选择的另一个列表。然后用户再次选择,它被重定向到ViewD。
/ControllerD/Function?Aid=1&Bid=2&Cid=3
ViewD根据ViewA、ViewB和ViewC的选择显示另一个列表,然后用户再次选择。
在这一点上,我想POST 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());
}
将post处理程序放在与其相关的控制器中通常是有意义的。但情况并非总是如此,因为有时创建一个新的控制器来处理与特定任务相关的所有帖子会更有意义。您还应该了解控制器中的方法与控制器中的方法之间的区别。控制器只是一个继承自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语句没有错,但是你的大部分逻辑应该由你的模型来处理。控制器主要用于在视图和模型之间传递数据。