2017-08-02 65 views
-1

有时您需要将一些额外的数据传递给视图。例如添加新闻页面中的新闻组,应该从数据库中检索。将模型中的额外数据传递给查看的最佳实践?

我知道,在视图中创建DB-方面的实例是不是这样做的一个很好的做法。相反,我们可以向视图模型添加一些属性,并将这些数据传递给视图或使用View-Bag并对其进行类型转换,但在这些情况下,您可能需要在HttpGet和HttpPost中编写一些代码,在Get和Post方法中返回相同的视图。

请告诉我做这样的操作的最佳做​​法是什么?有没有另一种方式写一次?

+0

使用视图模型(https://stackoverflow.com/questions/14423056/why-do-我们使用-的ViewModels) – Fran

+0

感谢的答案,正如我告诉,我知道如何通过在视图模型,这些额外的数据,一个视图模型是什么,如何以及为什么我们应该利用这个视图模型对业务逻辑之间的分离和UI逻辑。 –

+0

我想知道是否有另一种方式更好地匹配这些情况。 任何其他想法保持视图模型简单? –

回答

0

要仅写入一个组件并在不同视图中重新使用该组件,请将组件打包到自己的操作中,并使用它自己的ViewModelPartial View

如果它没有意义,这个动作可以从外部对自己被调用,它的属性如[ChildActionOnly]。数据库访问应该发生在这个子操作中,数据应该使用ViewModel传递给View。

渲染使用@Html.Action("{actionName}", "{controllerName}")在需要时通过该操作生成的HTML。

例如:

NewsController包含子行动:

[ChildActionOnly] 
public PartialViewResult ShowNewsGroups(long userId) { 

    var data = // ... read from DB using userId parameter 
    var vm = new ShowNewsGroupsViewModel { 
      GroupInfos = data 
    }; 

    return PartialView("_ShowNewsGroups", vm); 
} 

管窥_ShowNewsGroups.cshtml呈现新闻组:

@model ShowNewsGroupsViewModel 
@for(var i = 0; i < Model.GroupInfos.Count(); i++) { 
    @Html.DisplayFor(m => m.GroupInfos[i]) 
} 

主视图调用子操作,并传递所需的参数:

@Html.Action("ShowNewsGroups", "News", new { userId = Model.UserId })) 
0

对于我们使用视图模型的概念 其分毫但需要物业

例如,让只是一个模型这个specifc理由说你有一个模型叫测试,现在你想通过类似的isValid和日期时间的布尔一些额外的属性创建 所以

您的视图=模式将

public class YourViewMode 
{ 
public test mainModel{get;set;} 
public bool isValid {get;set;} 
public datetime Created {get;set;} 
} 

现在只是初始化这种模式您认为这是视图模型基本上是如何工作的

1

据我所知,你似乎掌握了你需要做的事情,但不喜欢get和post操作之间的代码重复。为此,只需将通用代码分解为两种操作都可以调用的控制器上的受保护或私有方法。例如,假设您需要的Foo项目选择列表:

public class MyViewModel 
{ 
    ... 
    public IEnumerable<SelectListItem> FooOptions { get; set; } 
} 

然后:

public class MyController : Controller 
{ 
    ... 

    private void PopulateFooOptions(MyViewModel model) 
    { 
     var foos = db.Foos.ToList(); 
     model.FooOptions = foos.Select(f => new SelectListItem { Value = f.Id.ToString(), f.Name }); 
    } 

    public ActionResult Create() 
    { 
     var model = new MyViewModel(); 
     PopulateFooOptions(model); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(MyViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // do stuff 
     } 

     PopulateFooOptions(model); 
     return View(model); 
    } 
} 
相关问题