ASP.NET MVC Создать на взаимосвязи мастер-деталь - PullRequest
5 голосов
/ 04 июня 2009

Я отображаю список предметов для данного заказа. Когда пользователь нажимает Добавить элемент, я перенаправляю на страницу Элемент / Создать. На этой странице собраны необходимые входные данные, но также необходимо знать идентификатор заказа, к которому относится элемент. Как правильно передать OrderID в Item / Create, чтобы он сохранялся после публикации формы при сохранении вновь созданного элемента.

Я играл с TempData и выписал идентификатор на странице сведений через Html.Encode (). Это помогает мне понять, что идентификатор отображается в форме элемента, но значение теряется при отправке и публикации формы. Я полагаю, потому что это не часть формы коллекции. Я предполагаю, что мой обходной путь не самый лучший способ и хотел бы знать, может ли кто-нибудь указать правильный способ сделать это в asp.net mvc.

Ответы [ 3 ]

3 голосов
/ 04 июня 2009

Я делаю это, создавая новый маршрут для контроллера Item, который включает в себя OrderId. Не имеет смысла иметь Item без Order, поэтому OrderId требуется с помощью параметра ограничений.

routes.MapRoute(
    "OrderItems",
    "Item/{action}/{orderId}/{id}",
    new { controller = "Item" },
    new { orderId = @"d+" }
);

Таким образом, URL будет выглядеть как http://<sitename>/Item/Create/8, где 8 - это OrderId, для которого создается элемент. Нечто подобное можно было бы сделать для маршрутов действия Delete с http://<sitename>/Item/Delete/8/5, где 8 - это OrderId, а 5 - это ItemId.

Ваши методы действий будут выглядеть так:

public ActionResult Create(int orderId)

public ActionResult Delete(int orderId, int id)

Вы также можете настроить его так, чтобы URL выглядели как http://<sitename>/Order/8/Item/Create и http://<sitename>/Order/8/Item/Delete/5, если кажется, что это более четко показывает, что происходит.

Тогда маршрут будет выглядеть так:

routes.MapRoute(
    "OrderItems",
    "Order/{orderId}/Item/{action}/{id}",
    new { controller = "Item" },
    new { orderId = @"d+" }
);
0 голосов
/ 04 июня 2009

Для обхода поля, которое не является частью обычного ввода данных, я обычно использую скрытое поле в представлении, например:

<%= Html.Hidden("OrderID", Model.OrderID) %>

Это выглядит как поле формы, действует как поле формы, но пользователь не может его видеть. Убедитесь, что вы вставили правильный идентификатор OrderID в вашу модель из контроллера.

0 голосов
/ 04 июня 2009

Я использовал эту последовательность (извините, если есть ошибки, я взял это из рабочего примера и изменил его для вашего вопроса):

1) В представлении Order.Details (предположим, что модель относится к типу Order):

...
<%= Html.ActionLink("Create New Item", "Create", "OrderItem", new { orderId = Model.ID }, null)%>
...

2) В действии OrderItem.Create:

public ActionResult Create(int orderId)
{
    ViewData["orderId"] = orderId;
    return View();
}

3) В представлении OrderItem.Create:

...
<% using (Html.BeginForm(new { orderId = ViewData["orderId"] }))
...

4) В действии OrderItem.Create POST:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(int orderId)
{
    // omitted code to create item, associated with orderId

    return RedirectToAction("Details", "Order", new { orderId = orderId });
}

Если кто-то может подумать о том, как улучшить это, или о лучшем способе, пожалуйста, присоединяйтесь, я сам немного новичок в этом, поэтому я хотел бы улучшить

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