我有一个表格,我想在提交后返回上一页。
一切正常但我有一个关于如何重载索引
的问题创建操作重定向到Tour Controller
的索引操作
这是我的index
行动
public ActionResult Index(string country)
{
if (country == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Country c = db.Countries.Where(e => e.CountryName.ToLower() == country.ToLower()).First();
ViewBag.ResultMessage = TempData["ResultMessage"];
ViewBag.Country = c.CountryName;
TempData["Country"] = c.CountryName;
var tours = db.Tours.Where(e => e.CountryId == c.Id);
var vm = new TourRequestViewModel { Tours = tours.ToList(), Request = new Models.Request() };
return View(vm);
}
我的问题是如何overload
index
[HttpPost]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,TourId,FirstName,LastName,Email,Phone,Comment,FrequentTraveler,TravelersCount,Date,ContactTimePreference,Country,Archived")] Request request)
{
if (ModelState.IsValid)
{
db.Requests.Add(request);
db.SaveChanges();
TempData["ResultMessage"] = "Form Posted successfully.";
return RedirectToAction("Index", "Tour", new { country = TempData["Country"] });
}
TempData["ResultMessage"] = "Try Again!";
return RedirectToAction("Index", "Tour", new { country = TempData["Country"] });
}
routes.MapRoute(
name: "TourRoute",
url: "{country}/tours",
defaults: new { controller = "Tour", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
具有相同的参数(如果可能的话),或者如何更改我可以设置[HttpPost]重载的参数索引方法。
我的创建操作如果需要:
{{1}}
我的路线配置,如果需要:
{{1}}
感谢您的帮助。
答案 0 :(得分:1)
POST方法的[Bind]
属性表明Request
有一个名为Country
的属性,因此您只需要在GET方法中设置该值
public ActionResult Index(string country)
{
if (country == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Country c = db.Countries.Where(e => e.CountryName.ToLower() == country.ToLower()).First();
ViewBag.ResultMessage = TempData["ResultMessage"];
var vm = new TourRequestViewModel
{
Tours = db.Tours.Where(e => e.CountryId == c.Id).ToList(),
Request = new Models.Request
{
Country = country
}
};
return View(vm);
}
旁注:您的Country c = db.Countries.Where(...).First();
会抛出异常,因为该国家/地区不存在。你应该使用.FirstOrDefault()
并检查它是否为null
(如果是,则返回NotFound或BadRequest)
然后在视图中,在Request
的表单内,为Country添加隐藏的输入
@Html.HiddenFor(m => m.Country)
然后最后,将POST方法更改为
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create (Request request)
{
if (ModelState.IsValid)
{
db.Requests.Add(request);
db.SaveChanges();
TempData["ResultMessage"] = "Form Posted successfully.";
return RedirectToAction("Index", "Tour", new { country = request.Country });
}
TempData["ResultMessage"] = "Try Again!";
return RedirectToAction("Index", "Tour", new { country = request.Country });
}
附注:如果ModelState
无效,则不应重定向到Index()
方法。而是返回视图,以便显示验证错误,用户可以更正数据。目前,向用户显示一个新的空白表格,他们不知道他们做错了什么。
答案 1 :(得分:0)
[HttpPost]
[ValidateAntiForgeryToken]
public virtual ActionResult Index(TourRequestViewModel model)
{
return View();
}
你的意思是?