ASP.NET MVC5 проблема при передаче данных между контроллерами - PullRequest
0 голосов
/ 18 декабря 2018

Я создаю базовую заявку на аренду автомобиля.Пользователь может просмотреть автомобили и нажать кнопку Rent.После нажатия на нее мне нужно вернуть новый View, который содержит форму, которую пользователь должен заполнить, чтобы завершить заказ.У меня проблемы с передачей данных Car, а также данных Customer между контроллерами для выполнения Rent.

На главной странице у меня есть ссылка 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");
}

Яполучая ошибку HTTP 404 каждый раз, когда я пытаюсь получить доступ к Rents/Create.

Ответы [ 5 ]

0 голосов
/ 18 декабря 2018

Как уже упоминалось в комментариях, вам нужно будет передать необходимые параметры в оператор перенаправления.

public ActionResult Rent(string id)
{
    Rent rentItem = new Rent();

    return RedirectToAction("Create", "Rents", new { carId = id, rent = rentItem});
}
0 голосов
/ 18 декабря 2018

Вы можете упростить то, что вы пытаетесь сделать.Основные моменты, на которые следует обратить внимание:

  • Вам не нужно ссылаться на действие 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");
}
0 голосов
/ 18 декабря 2018

Вы либо не передали параметры, либо пропустили приведенный ниже метод, если хотите вернуть представление с вашим перенаправлением

public ActionResult Create() 
{ 
   return View(); 
}
0 голосов
/ 18 декабря 2018

Я не знаю, используя несколько объектов публикации, но вы можете опубликовать один объект публикации как этот

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

    });
0 голосов
/ 18 декабря 2018

Как вы можете видеть ниже, вы можете передавать параметры в метод RedirectToAction ().

RedirectToAction(String, String, RouteValueDictionary)

Перенаправляет на указанное действие, используя имя действия, имя контроллера и значения маршрута.Попробуйте перенаправить действие Создать с помощью объекта carId и Rent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...