ASP.Net MVC 2 - 通过在params中指示返回Action和Controller来重用Controller / View

时间:2011-01-08 20:11:18

标签: asp.net-mvc-2

问题:

在我的应用程序中,我为用户提供了几个地方的选择屏幕(也就是说,必须在多个操作中使用相同的选择屏幕)。

解决方案:

我提出了以下解决方案:将返回操作和控制器传递给处理实体选择的操作

实施例

假设应用程序中有多个位置,用户必须选择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的新手,所以我不知道是否有其他(标准)解决方案。

这种做法是否正确/整洁?你有不同的解决方法吗?

1 个答案:

答案 0 :(得分:0)

我可能误解了你的问题,但我认为Partial Views将是你正在寻找的“标准”解决方案。

部分视图就是这样,可以插入到其他视图中的小视图。输入表单或数据显示等内容可以放入局部视图中并添加到常规视图中。它们大大简化了代码。

他们很容易制作。当您进行常规视图时,只需选中窗口中的“部分视图”框(即在右键单击解决方案资源管理器并选择“添加视图”选项后)。然后,您可以使用<%: Html.Partial("myPartialView") %>将其放入任何完整视图中。您可以通过执行<%: Html.Partial("myPartialView", Model) %>

轻松地将模型传递到局部视图