ASP.ne MVC在为httppst提交表单_索引操作重载后返回上一页

时间:2016-07-09 08:51:15

标签: asp.net-mvc forms

我有一个表格,我想在提交后返回上一页。

一切正常但我有一个关于如何重载索引

的问题

创建操作重定向到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}}

感谢您的帮助。

2 个答案:

答案 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();
}
你的意思是?