Подтвердить что ты не робот

Перенаправление ASP.NET MVC с моделью

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

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

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

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

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

EDIT: для подтверждения - модель, созданная действием Create, отличается от стандартной, созданной действием Details. Поэтому выполнение прямого перенаправления на Action и передача Id не работает, поскольку созданная модель неверна. Чтобы дать больше контекста, модель из действия "Создать" содержит дополнительное значение "Человек, созданный успешно", если я перенаправляюсь к действию "Сведения", это сообщение отсутствует в модели.

4b9b3361

Ответ 1

user460667,

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

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

то не могло ли ваше действие Details выглядеть следующим образом:

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

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

[edit]:

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

Ответ 2

Вы можете добавить то, что было предложено (используйте 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);
    }

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

Ответ 3

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

return RedirectToAction("Details", new { id = person.PersonID });

Ответ 4

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

return this.RedirectToAction<MyController>(c => c.Details(person.PersonID));