ASP.NET MVC Redirect с моделью - PullRequest
       9

ASP.NET MVC Redirect с моделью

39 голосов
/ 25 октября 2010

У меня в настоящее время есть метод в моем контроллере, который принимает коллекцию форм, сохраняет данные и затем отображает данные на странице «Подробности».На данный момент код в настоящий момент выглядит примерно так:

[HttpPost]
public ActionResult Create(PersonModel person)<br>
{
    if (person.IsValid())
    {
        person.additionalData = "Person created successfully";
        return View("Details", person);
    }
}

Проблема заключается в том, что при возврате представления «Сведения» таким образом сохраняется URL-адрес mysite / Person / Create - в идеале хотелось бы, чтобы URL-адрес был mysite /Person / Details / IdGoesHere.

Я уверен, что это должно быть возможно.Очевидно, что я мог бы использовать Response.Redirect, однако это не позволяет мне передавать модель в представление.Насколько я могу судить, я не могу передать модель с помощью RedirectToAction?

Спасибо за помощь.

РЕДАКТИРОВАТЬ: Подтвердить - модель, созданная действием Создать, отличается отпо умолчанию, созданный действием Details.Следовательно, выполнение прямого перенаправления в Action и передача идентификатора не работает, поскольку созданная модель не верна.Чтобы получить больше контекста, модель из действия «Создать» содержит дополнительное значение, которое говорит «Персона создана успешно». Если я перенаправлю на действие «Детали», это сообщение отсутствует в модели.

Ответы [ 4 ]

35 голосов
/ 25 октября 2010

Прямо из моего собственного приложения:

public ActionResult Create(Booking item)
{
    if (ModelState.IsValid)
    {
        int newID = _tasks.Create(item);
        // NEW section to emulate model being populated for use in Details view
        TempData["additionalData"] = "Person created successfully";
        return RedirectToAction("Details", new { id = newID });
    }
    else
    {
        return View();
    }
}

тогда, может ли ваше действие "Детали" быть таким:

public ActionResult Details(int id)
{
    var item = _tasks.GetByKey(id);
    var additionalData = TempData["additionalData"];
    if(item != null) {
        if(additonalMessage!=null)
        {
            item.additionalData = additionalData;
        }
        return View(item);
    }
    else
        return View("Notfound");
}

не могли бы вы принять подобный подход??

Вы можете просто выполнить перенаправление в соответствии с соглашением и установить флаг (для временных данных, как указано выше), который выдает это сообщение?Флаг tempadata будет установлен ТОЛЬКО внутри действия Create, поэтому он будет происходить только при создании нового объекта person.таким образом, действие Подробности будет отображаться только как последствие действия Создать

9 голосов
/ 25 октября 2010

Вы можете дополнить то, что было предложено (используйте RedirectToAction и маршрутизацию) с использованием TempData

[HttpPost]
public virtual ActionResult Create(IEnumerable<OrderItem> orderItems)
    {
        if (orderItems.Count() == 0)
        {
            return RedirectToAction("NoOrderItems");
        }
        else
        {
            TempData["orderItems"] = orderItems;
            return RedirectToAction("Confirm");
        }
    }

    [HttpGet]
    public virtual ActionResult Confirm()
    {
        var orderItems = TempData["orderItems"] as IEnumerable<OrderItem>;
        if (orderItems == null || orderItems.Count() == 0)
        {
            this.InvokeHttp404(ControllerContext.HttpContext);
        }

        return View(orderItems);
    }

Я использую это для элементов, которые я, возможно, не захочу снова создавать при последующих запросах или пока что они сохраняются в базе данных. При этом мне не нужны нулевые проверки, так как страница подтверждения может быть «получена» только при наличии данных для нее.

9 голосов
/ 25 октября 2010

Это должно привести вас к модели детали, передавая идентификатор.

return RedirectToAction("Details", new { id = person.PersonID });
8 голосов
/ 25 октября 2010

Имейте в виду, что вы также можете воспользоваться безопасным типом MvcContrib и сделать

return this.RedirectToAction<MyController>(c => c.Details(person.PersonID));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...