2013-10-01 45 views
1

错误404我有这样的控制器:MVC 4上创建的视图

[Authorize] 
public class CheckoutController : Controller 
{ 

    ShoppingCartContext storeDB = new ShoppingCartContext(); 
    const string PromoCode = "FREE"; 

    [HttpPost] 
    public ActionResult AddressAndPayment(FormCollection values) 
    { 
     var order = new Order(); 
     TryUpdateModel(order); 

     try 
     { 
      if (string.Equals(values["PromoCode"], PromoCode, 
       StringComparison.OrdinalIgnoreCase) == false) 
      { 
       return View(order); 
      } 
      else 
      { 
       order.Username = User.Identity.Name; 
       order.OrderDate = DateTime.Now; 

       //Save Order 
       storeDB.Orders.Add(order); 
       storeDB.SaveChanges(); 
       //Process the order 
       var cart = Models.ShoppingCart.GetCart(this.HttpContext); 
       cart.CreateOrder(order); 

       return RedirectToAction("Complete", 
        new { id = order.OrderId }); 
      } 
     } 
     catch 
     { 
      //Invalid - redisplay with errors 
      return View(order); 
     } 
    } 

    public ActionResult Complete(int id) 
    { 
     // Validate customer owns this order 
     bool isValid = storeDB.Orders.Any(
      o => o.OrderId == id && 
      o.Username == User.Identity.Name); 

     if (isValid) 
     { 
      return View(id); 
     } 
     else 
     { 
      return View("Error"); 
     } 
    } 

} 

而且我已经创建了一个查看Checkout下称为AddressAndPayment,所以它去localhost/Checkout/AddressAndPayment但我只得到一个404错误,即使我的权利点击视图并点击页面检查器中的视图。我不知道为什么它创建时甚至没有显示视图。

+0

你如何申请'localhost/Checkout/AddressAndPayment'?如果它不是'POST'请求,那么就没有匹配的路由。 – David

回答

3

您需要相应的HttpGet方法,因为您当前的方法只接受HttpPost请求。添加以下内容:

[HttpGet] 
public ActionResult AddressAndPayment() 
{ 
    return View(); 
} 
+0

默认情况下,每个操作都会侦听GET请求,所以'HttpGet'属性是多余的。尽管如此,你的回答是正确的,+1。 –

+1

@HenkMollema虽然是真的,但你应该养成装饰'HttpGet' **和**'HttpPost'方法的习惯,否则在某些情况下你最终可能会在HttpPost请求中触发'HttpGet'动作将匹配它看到的第一个)。花费几个小时来调试这样的愚蠢问题。 – mattytommo