我正在构建一个基本的汽车租赁应用程序。用户可以查看汽车并单击Rent
按钮。单击它后,我需要返回一个新的View
,其中包含一个表格,用户必须填写该表格才能完成订单。为了完成Car
,我在控制器之间传递Customer
数据和Rent
数据时遇到问题。
在主页上,每辆车下面都有一个出租链接。这是代码:
<div class="col-md-12">
<p>@Html.ActionLink("Rent", "Rent" , new { Id = car.Id})</p>
</div>
Rent
中的 HomeController
方法
public ActionResult Rent(string id)
{
return RedirectToAction("Create", "Rents");
}
Create
中的 RentsController
方法
[HttpPost]
public ActionResult Create(string carId, Rent rent)
{
if (!ModelState.IsValid)
return View();
var carToRent = context.Cars.SingleOrDefault(c => c.Id == carId);
if (carToRent == null)
return Content($"Car not found!");
rent.Car = carToRent;
var customer = context.Customers.SingleOrDefault(c => c.UserId == User.Identity.Name);
if (customer == null)
return Content($"Customer not found!");
rent.Customer = customer;
context.Rents.Add(rent);
context.SaveChanges();
return RedirectToAction("Index");
}
每次尝试访问Rents/Create
时,都会收到HTTP 404错误。
答案 0 :(得分:1)
如下所示,您可以在RedirectToAction()方法中传递参数。
RedirectToAction(String, String, RouteValueDictionary)
使用操作名称,控制器名称和路由值重定向到指定的操作。尝试使用carId和Rent对象重定向Create操作。
答案 1 :(得分:1)
我不知道使用多个发布对象,但是您可以像这样发布一个发布对象
public class MyPostObject
{
public string carId { get; set; }
public Rent rent{ get; set; }
}
并这样发布
[HttpPost]
public ActionResult Create(MyPostObject myPostObject)
{
string carId=myPostObject.carId;
Rent rent = myPostObject.rent;
....
}
更新:或者您可以将多个post对象与Ajax一起使用
$("#btnSave").on('click', function () {
var url = '@Url.Action("Create", "Rent")';
//Rent class properties
var data=
{
Brand: 'Renault',
Model: 'Megan',
};
$.ajax({
url:url,
type:"POST",
data:{
carId:'12',
rent:data
},
datatype:'json',
ContentType:'application/json;utf-8'
}).done(function(resp){
alert('Success ' +resp);
}).error(function(err){
alert("Error " + err.status);
});
});
答案 2 :(得分:1)
您可以简化您的尝试。要注意的要点如下:
Rent
操作即可,
重定向到Create
操作-只需链接到Create
操作
直。 ActionLink
的另一个重载可以让您指定
控制器(请参见下文)。Create
操作
需要输入Rent rent
的参数-可以创建
在Create
操作中并简化所需的数据
从视图传递到控制器。请在代码中查看我的评论以进一步说明:
查看:
//call the Create action on the RentsController directly from the view
<div class="col-md-12">
<p>@Html.ActionLink("Rent", "Create", "Rents" , new { Id = car.Id }, null)</p>
</div>
控制器:
//modify signature to remove passing a Rent object it
//you can create this object inside of this method
//and do not need to pass one in so remove it from the method signature
[HttpPost]
public ActionResult Create(string carId)
{
if (!ModelState.IsValid)
return View();
var carToRent = context.Cars.SingleOrDefault(c => c.Id == carId);
if (carToRent == null)
return Content($"Car not found!");
var rent = new Rent(); //this line has been added since the method signature was changed
rent.Car = carToRent;
var customer = context.Customers.SingleOrDefault(c => c.UserId == User.Identity.Name);
if (customer == null)
return Content($"Customer not found!");
rent.Customer = customer;
context.Rents.Add(rent);
context.SaveChanges();
return RedirectToAction("Index");
}
最后,您可以删除以下内容:
//delete this action entirely, if youre doing nothing other than redirecting
//to an action then just link directly to the action you want
//notice the ActionLink in the view is modified to hit the Create action directly
public ActionResult Rent(string id)
{
return RedirectToAction("Create", "Rents");
}
答案 3 :(得分:0)
您没有传递参数,或者如果您希望通过重定向返回视图,则缺少以下方法
public ActionResult Create()
{
return View();
}
答案 4 :(得分:0)
如评论中所述,您将必须将必需的参数传递到重定向语句中。
public ActionResult Rent(string id)
{
Rent rentItem = new Rent();
return RedirectToAction("Create", "Rents", new { carId = id, rent = rentItem});
}