Проблема:
В моем приложении я предоставил пользователю экран выбора для чего-то в нескольких местах (то есть один и тот же экран выбора должен использоваться в нескольких действиях).
Решение:
Я пришел к следующему решению: передать действие return и контроллер в действие, которое обрабатывает выбор сущности .
Пример:
Предположим, что в приложении есть несколько мест, где пользователь должен выбрать экземпляр SomeEntity
, поэтому я добавил к этому контроллеру сущности следующее действие:
public class SomeEntityController : Controller
{
/* ... */
public ViewResult Select(string returnAction, string returnController)
{
var selectableEntities = ...;
return View(
new SelectionViewModel<SomeEntity>
{
Entities = selectableEntities,
ReturnAction = returnAction,
ReturnController = returnController,
});
}
}
В представлении для этого действия (Views / SomeEntity / Select.aspx) я поместил что-то вроде этого:
<table>
<tr>
<th>Select</th>
<th>SomeProperty<th>
</tr>
<% foreach (var entity in Model.Entities) { %>
<tr>
<td>
<%: Html.ActionLink("Select", Model.returnAction, Model.returnController, new { entityId = entity.id }) %>
</td>
<td><%: entity.SomeProperty %></td>
</tr>
<% } %>
</table>
Затем, если мне нужно, чтобы пользователь выбрал SomeEntity
в другом контроллере, я могу сделать это:
public class OtherController : Controller
{
public ActionResult SelectSomeEntity()
{
return RedirectoToAction("Select", "SomeEntity", new { returnAction = "ActionThatNeedsAnEntity", returnController = "Other" });
}
public ActionResult ActionThatNeedsAnEntity(int entityId)
{
// here I can use the selected entity
}
}
Последний фрагмент кода является лишь примером того, как использовать действие выбора SomeEntity
. Вместо действия SelectSomeEntity
может быть более сложное действие, которое выполняет некоторые проверки, чтобы увидеть, выбран ли уже entityId
(например, сохранен ли в сеансе), и затем решает, вызывать ли SomeEntity/Select
или нет
Вопрос:
Вышеописанное работает нормально, но я новичок в ASP.Net MVC 2, поэтому я не знаю, есть ли другое (стандартное) решение для этого.
Является ли этот подход правильным / аккуратным? Вы решили эту ситуацию по-другому?