在控制器之间传递数据的ASP.NET MVC5问题

时间:2018-12-18 12:27:07

标签: c# asp.net asp.net-mvc

我正在构建一个基本的汽车租赁应用程序。用户可以查看汽车并单击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错误。

5 个答案:

答案 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});
}