从这个问题看,让控制器创建一个更准确地反映视图试图显示的模型的ViewModel似乎是有道理的,但我对一些约定感到好奇(我是MVC模式的新手) ,如果还不是很明显的话).
基本上,我有以下问题:
这基本上就是现在.我可能会再提出一些问题,但是在最后一个小时左右这一直困扰着我,我似乎在其他地方找到了一致的指导.
编辑: 看看CodePlex 上的示例NerdDinner应用程序,它看起来像ViewModel是控制器的一部分,但它仍然让我感到不舒服,他们不在他们自己的文件中.
假设您有一个ASP.NET MVC项目并且正在使用服务层,例如在asp.net站点上的这个联系管理器教程中:http: //www.asp.net/mvc/tutorials/iteration-4-make-的应用程序,松散耦合-CS
如果您有视图的视图模型,那么服务层是否适合提供每个视图模型?例如,在服务层代码示例中有一种方法
public IEnumerable<Contact> ListContacts()
{
return _repository.ListContacts();
}
Run Code Online (Sandbox Code Playgroud)
如果你想要一个IEnumerable,它应该进入服务层,还是在其他地方是"正确"的地方?
也许更合适的是,如果您为与ContactController关联的每个视图都有一个单独的视图模型,那么ContactManagerService是否应该有一个单独的方法来返回每个视图模型?如果服务层不是正确的位置,那么viewmodel对象应该在哪里被初始化以供控制器使用?
我有两个视图模型:
public class ParentViewModel
{
public Id { get; set; }
.....
public ChildViewModel Child{ get; set; }
}
public class ChildViewModel
{
public ChildId { get; set; }
.....
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public ActionResult Index()
{
.... <some code>
return View("NewIndex", ParentViewModel);
}
[HttpPost]
public ActionResult PartialAction(ChildViewModel childView)
{
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
和观点:指数
@model ParentViewModel
....
@Html.Partial("_Partial", Model.Child)
Run Code Online (Sandbox Code Playgroud)
和_Partial
@model ChildViewModel
... do some stuff with child model
Run Code Online (Sandbox Code Playgroud)
当我试图打开索引页面时,我遇到了错误:
传递到字典中的模型项的类型为"ParentViewModel",但此字典需要"ChildViewModel"类型的模型项.
为什么它尝试传递ParentViewModel而不是ChildViewModel.我做错了什么?
我跟随音乐商店的例子来尝试学习ASP.NET MVC.我正在创建一本食谱应用程序.
我创建了我的viewmodel,如下所示:
namespace CookMe_MVC.ViewModels
{
public class CookMeIndexViewModel
{
public int NumberOfReceipes { get; set; }
public List<string> ReceipeName { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我的控制器看起来像这样
public ActionResult Index()
{
var meals= new List<string> { "Dinner 1", "Dinner 2", "3rd not sure" };
//create the view model
var viewModel = new CookMeIndexViewModel
{
NumberOfReceipes = meals.Count(),
ReceipeName = meals
};
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
最后,我的观点看起来像这样
@model IEnumerable<CookMe_MVC.ViewModels.CookMeIndexViewModel>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr> …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的ASP.Net应用程序中使用PagedList,我在微软网站上找到了这个例子http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting -filtering-和寻呼与-的实体框架功能于一个-ASP净MVC-应用
在使用ViewModel的复杂情况下如何使用PagedList?我正在尝试添加一个没有成功的PagedList到这里发布的教师示例:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with -the-实体框架功能于一个-ASP净MVC-应用
问题是ViewModel由类而不是简单字段组成,因此我无法使用ToPageList()方法转换结果.
这是ViewModel结构:
using System.Collections.Generic;
using ContosoUniversity.Models;
namespace ContosoUniversity.ViewModels
{
public class InstructorIndexData
{
public IEnumerable<Instructor> Instructors { get; set; }
public IEnumerable<Course> Courses { get; set; }
public IEnumerable<Enrollment> Enrollments { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我需要将三个表连接到ViewModel并在View中显示结果.
我对使用ViewModel相当新,我想知道,ViewModel是否可以将域模型的实例包含为属性,或者这些域模型的属性是否应该是ViewModel本身的属性?例如,如果我有一个班级Album.cs
public class Album
{
public int AlbumId { get; set; }
public string Title { get; set; }
public string Price { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您是否通常让ViewModel保存Album.cs该类的实例,或者您是否让ViewModel具有每个Album.cs类属性的属性.
public class AlbumViewModel
{
public Album Album { get; set; }
public IEnumerable<SelectListItem> Genres { get; set; }
public IEnumerable<SelectListItem> Artists { get; set; }
public int Rating { get; set; …Run Code Online (Sandbox Code Playgroud) 我有一个asp.net-mvc网站,其中包含以下文件夹:
我现在想要在另一个.net应用程序(一个Windows控制台应用程序,所以根本不是网络)访问大量的业务逻辑和数据库访问代码和数据,所以我重构尽可能多的东西移除MVC项目和进入解决方案中的其他项目,以便可以与其他解决方案共享代码.
我有两个主要问题;
我的主要问题是我正在努力找到一个放置生成ViewModel的代码的地方,因为我想在我的控制台应用程序中重用这些代码,因为控制台应用程序发送的电子邮件需要相同的数据.视图.
另一个主要问题是,当我的许多实例化我的视图模型的函数以一堆数据库访问代码开始时,我仍然很难看到如何将我的数据库访问代码移出MVC项目,同时仍然有ViewModel.
到目前为止,这里有一些细节和我的过程:
所以移动DomainModel项目很简单(因为那里有许多原始对象,其中包含一些业务逻辑 - 没有关于它的网络).
我尽可能地减少了控制器的数量,并将任何业务逻辑或复杂的数据访问逻辑移到了Models文件夹中.当我试图将模型文件夹移到MVC项目之外时,有些事情破了:
在稀疏控制器时,我有许多不同的控制器动作可以转到模型类并返回我传递回视图的ViewModel.像这样的东西(在我的控制器类中):
public ActionResult ApplicationDetail(int id)
{
AppDetailViewModel applicationViewModel = Model.GenerateAppDetailViewModel(id);
return View(applicationViewModel);
}
Run Code Online (Sandbox Code Playgroud)
所以我的Model文件夹中的文件依赖于ViewModel类.我确实希望集中GenerateAppDetailViewModel()函数,因为它在多个不同的控制器中使用.此外,在我的控制台应用程序(发送电子邮件,我经常想要获取恰好在某个视图上的所有数据,所以我的代码"希望"也利用视图模型..如果我将它移出MVC项目然后我可以重用但我认为有依赖性问题(显然我不需要在我的控制台应用程序中使用SelectListItem,但在其他情况下,它们只是生成视图所需的不同数据的容器对象,我确实要重用)
或另一件破坏的事情是依赖:
System.Web.Mvc
Run Code Online (Sandbox Code Playgroud)
因为我有很多代码:
我想寻找关于打破这种依赖关系的最佳方法的建议,这样我就可以尽可能多地从MVC项目中移出代码以便重用.
问题是,如果我尝试将我的ViewModel代码吸入Model文件夹并进入另一个项目,那么我再次陷入困境,因为ViewModel类有很多依赖性
System.Web.Mvc
由于像SelectListItem这样的东西.
我应该有2个视图模型文件夹(MVC项目中有一个具有特定的system.web.mvc引用,另一个位于不同的项目中吗?).似乎依赖于SelectListItem是导致争用的原因
在我看过的大多数示例中,ViewModes确实依赖于System.Web.Mvc,例如本教程
我看过这些问题:
哪些是相关的,但不确定他们回答我所说的具体的整体重构问题.
c# model-view-controller asp.net-mvc refactoring asp.net-mvc-viewmodel
在MVC开发方面,我一直在做教程并尝试学习最佳实践.我在下面使用的设计来自Apress/Adam Freeman的Pro ASP.Net MVC5.到目前为止,一切都很顺利......但我仍然没有完全掌握与控制器的合作.是的,我理解控制器的概念,但在发布和获取方法时仍然很难.以下是我的示例MVC应用程序的流程:
我的app.Domain项目
我在数据库中有一个用户表,并使用Entities/Users.cs引用它
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace app.Domain.Entities
{
public class Users
{
[Key]
public int UserID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string City { get; set; }
public string State { get; set; }
public DateTime CreateDate { get; set; }
public DateTime LastLogin { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,我有一个接口,它位于Abstract/IUsersRepository.cs
using …Run Code Online (Sandbox Code Playgroud) 我有一个问题,当我发布到控制器时,我失去了绑定,我的视图模型中的所有内容都是NULL.这是我正在使用的代码:
视图:
@model ArticleCategoryVm
@using (@Html.BeginForm())
{
@Html.HiddenFor(model => model.LanguageIdDisplayed)
<label>Name: <span class="label label-important">Required</span></label>
@Html.HmlValidationFor(model => model.CategoryName)
@Html.TextBoxFor(model => model.CategoryName, new { maxlength = "255", placeholder = "Category Name", @class = "input-xlarge-fluid" })
<span class="help-block">The is the name of the category and how it appears on the site.</span>
<label>Language: <span class="label label-important">Required</span></label>
@Html.HmlValidationFor(model => model.LanguageId)
@Html.DropDownList("LanguageId", new SelectList(@Model.Languages, "Value", "Text"), "Select language", new { @class="input-xlarge-fluid" })
<span class="help-block">This will be the language that the category is set too.</span>
<label>Parent:</label>
@Html.HmlValidationFor(model …Run Code Online (Sandbox Code Playgroud) 这更像是一个通用的架构问题:
我试图决定我的程序员是否可以使用"ViewBags"将数据传递给已经接受模型的视图.
我个人的偏好是避免使用ViewBags并构建包含视图所需的所有数据的Robust Models:
方法1:
MODEL A:
- List of Employees
- Nullable integer, indicating which item from the list is currently selected
- string firstName (empty if index is null)
- string lastname (empty if index is null)
Run Code Online (Sandbox Code Playgroud)
方法2:
MODEL A:
- List of Employees
ViewBag:
- ViewBag.Index (indicating which item from the list is currently selected)
- ViewBag.FirstName
- ViewBag.LastName
Run Code Online (Sandbox Code Playgroud)
任何人都可以想到为什么Approach2会优于方法1?
感谢您的输入
asp.net-mvc ×7
c# ×4
asp.net ×1
controllers ×1
http-post ×1
mvvm ×1
pagedlist ×1
razor ×1
refactoring ×1
viewbag ×1