0

请建议在 MVC3 中组织编辑我的餐厅实体的最佳方法。

我已经有 _Layout 页面,该页面的页眉和页脚对于网站的所有页面都是通用的。_Layout 具有以“内容”为名称的部分。

对于餐厅编辑,我创建了另一个名为 _Restaurant 的布局,它添加了带有编辑基本信息、照片、类别等选项的侧边导航。所有导航链接都是使用类似这样的命令创建的 @Html.ActionLink("Some name","Edit" , "Restaurant", new {id=Model.ID}),所有链接都具有相同的控制器名称和路由值。此布局的模型是餐厅(需要构建适当的导航链接)

目前我已经为编辑和照片实现了视图,这个结构工作得很好,因为两个视图都使用餐厅作为模型。但是我担心在尝试实现餐厅产品和类别的编辑时可能会遇到一些问题,因为这个页面需要不同的模型。

在这种情况下你有什么建议?我知道我可以使用局部视图来生成子导航,但是在这种情况下,我需要在我生成的所有视图中插入渲染代码,所以我认为这不是最好的解决方案。

4

1 回答 1

1

听起来您拥有的 Restaurant 模型是域模型的一部分,并且您正在视图中使用它。如果是这样,那么您应该考虑使用视图模型,其中每个模型都特定于您正在创建的视图。视图模型的内容可以根据需要映射到域模型或从域模型映射,以防止您在实现产品编辑和类别编辑视图时遇到您提到的字段不匹配。可以手动执行此映射(即逐个字段复制),也可以使用 automapper 等工具为您执行此映射。

编辑:

据我了解,如果您访问网站的餐厅部分,您会有一个侧边导航,其中的链接始终相同,但需要为该餐厅动态生成。

布局是否_Restaurant包含与 main 中定义的元素相似的元素_Layout?如果是这样,我会将_Restaurant布局设为嵌套布局(如果还没有的话),这样您就不必重新定义这些元素。

例如:

主要_Layout将被定义:

<html>
...
<body>
    <!--main navigation here-->
    @RenderBody()
<body>
</html>

_Restaurant然后可以定义嵌套布局:

@{
    Layout = "_Layout.cshtml"
}
<!-- Define elements for the restaurant layout here-->
@RenderBody()

您可以在此布局中定义餐厅元素,但不能在此处定义侧导航,因为它需要生成视图模型。因此,如果嵌套布局中唯一出现的是侧面导航,那么我什至不会使用嵌套布局。否则,(如果嵌套布局中定义了其他元素),那么您可以在嵌套布局中定义一个部分 ( @RenderSection) 以确保使用它的所有视图都定义一个侧边导航。

然后每个视图将被定义为类似于以下内容(使用子操作来呈现侧导航):

@model ...

@{
    Layout = "~/_Restaurant.cshtml"
}

@Html.RenderAction("SideNavigation", "RestaurantController", new { id = Model.Id })

然后子动作将被定义为:

public class RestaurantController : Controller
{
    [ChildActionOnly]
    public PartialViewResult SideNavigation(int id)
    {
        return PartialView();
    }
}

然后,这会将 id 传递给部分视图,该部分视图将被定义为:

@model int

<!--code to display the side navigation-->

希望这会有所帮助。

于 2012-05-20T16:06:56.660 回答