我有一个视图,列出要添加到平面图的表.从表中获得TableInputModel允许RectangleTableInputModel,CircleTableInputModel等
ViewModel有一个列表,TableInputModel其中包含所有派生类型.
我对每个派生类型都有局部视图,并且给定了一个List混合派生类型,框架知道如何渲染它们.
但是,在提交表单时,类型信息会丢失.我尝试使用自定义模型绑定器,但因为类型信息在提交时丢失了,所以它不会工作...
有人曾尝试过这个吗?
假设我有一个允许编辑用户详细信息的页面,所以我有一个像这样的ViewModel:
public class UserViewModel {
public string Username { get; set; }
public string Password { get; set; }
public int ManagerId { get; set; }
public string Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以在我的EditUser操作中,我可以通过模型绑定器传回它,然后我可以将其映射到域模型:
public ActionResult EditUser(UserViewModel user) {
...
Run Code Online (Sandbox Code Playgroud)
但是,显示表单的页面还需要详细信息,例如管理器和类别列表,以提供这些字段的下拉列表.它还可能会在侧边栏中显示其他用户的列表,以便您可以在正在编辑的不同用户之间切换.
那么我有另一个视图模型:
public class ViewUserViewModel {
public UserViewModel EditingUser { get; set; }
public IEnumerable<SelectListItem> Managers { get; set; }
public IEnumerable<SelectListItem> Categories { get; set; }
public IEnumerable<SelectListItem> AllUsers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?它们都是View Models吗?如果是这样,我是否应该使用命名约定,以便区分类似模型的虚拟机和仅包含页面数据的虚拟机?
我错了吗?
ViewModel是MVVM(Model-View-ViewModel)和ASP.NET MVC的推荐实现中使用的术语.研究"ViewModel"可能会让人感到困惑,因为每个模式都使用相同的术语.
MVC ViewModel和MVVM ViewModel之间的主要区别是什么?例如,我认为MVVM ViewModel更加丰富,因为缺少Controller.这是真的?
我很好奇人们构建ViewModel的各种方式以及他们选择该方法的原因.
我可以在这里想到几种方法:
-1.注入的存储库 - 控制器加载模型并映射到ViewModel.在这里,ViewModel构造函数可以采用各种集合来为ex设置.在选择列表中,例如:
public CustomerController(ISomeRepository repository)
{
_repository = repository;
}
public ActionResult Create()
{
CustomerCreateViewModel model = new CustomerCreateViewModel(_repository.GetShipTypes,
_repository.GetStates);
..
..
}
-2.ViewModelBuilder - 在控制器中注入或实例化注入存储库的实例.通过类似的东西调用
>var orderViewModel = orderViewModelBuilder.WithStates().Build(orderId);Run Code Online (Sandbox Code Playgroud)
要么,
var orderViewModel = orderViewModelBuilder.WithStates().Build(orderId);Run Code Online (Sandbox Code Playgroud)
-3.直接在控制器中(无需代码 - 杂乱无章)
-4.一些其他服务(注入或不注入)返回控制器随后映射的域模型或ViewModel(执行此操作的任何人返回未明确命名/注释为ViewModel构建器类的视图模型?)
public JobCreateViewModel BuildJobCreateViewModel(int parentId)
{
JobCreateViewModel model = new JobCreateViewModel();
model.JobStatus = _unitOfWork.JobRepository.GetJobStatuses();
model.States=_unitOfWork.StateRepository.GetAll();
return model;
}
Run Code Online (Sandbox Code Playgroud)
现在回程 - 关于验证您的视图模型 - 您是从基础ViewModel类继承标准验证,还是在所有ViewModel之间复制验证(例如数据注释属性),或者只是依赖于服务器端验证,以便它可以再次验证您的域对象吗?
还有其他人?还有什么更好的?为什么?
编辑 根据下面的链接,我确实找到了Jimmy Bogard关于ViewModels架构的好文章.虽然它没有直接解决上面的问题,但对于来这里查看ViewModel信息的人来说,它是一个很好的参考. http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/
我是一名iOS开发人员,我在项目中使用Massive View控制器,因此我一直在寻找一种更好的方法来构建我的项目,并且遇到了MVVM(Model-View-ViewModel)架构.我一直在用iOS阅读很多MVVM,我有几个问题.我将用一个例子来解释我的问题.
我有一个名为的控制器LoginViewController.
LoginViewController.swift
import UIKit
class LoginViewController: UIViewController {
@IBOutlet private var usernameTextField: UITextField!
@IBOutlet private var passwordTextField: UITextField!
private let loginViewModel = LoginViewModel()
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func loginButtonPressed(sender: UIButton) {
loginViewModel.login()
}
}
Run Code Online (Sandbox Code Playgroud)
它没有Model类.但我确实创建了一个名为LoginViewModel放置验证逻辑和网络调用的视图模型.
LoginViewModel.swift
import Foundation
class LoginViewModel {
var username: String?
var password: String?
init(username: String? = nil, password: String? = nil) {
self.username = username
self.password = password
}
func validate() {
if username == nil || …Run Code Online (Sandbox Code Playgroud) 我是MVC4,EF5和ASP.Net的新手,我似乎无法在任何地方找到一个好的答案.
基本上,是否应该通过视图模型完成所有操作,还是可以合并viewbag?
假设我有一个填充下拉列表的方法,我使用viewmodel来表示视图的输出.
我可以使用Viewbag.DropDown = PopulateDropdown();或者将它合并到ViewModel中更好,通过创建一个属性来保存List<SelectListItem>创建者PopulateDropdown();吗?
我知道ViewBag有多方便,但是我还没有看到任何不使用它的坚实理由?如果有人也能为我提供更多的见解,那就太棒了.
我有一个标准的Domain Layer实体:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
它具有某种验证属性:
public class Product
{
public int Id { get; set; }
[NotEmpty, NotShorterThan10Characters, NotLongerThan100Characters]
public string Name { get; set; }
[NotLessThan0]
public decimal Price { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我已经完全弥补了这些属性.这里使用的验证框架(NHibernate Validator,DataAnnotations,ValidationApplicationBlock,Castle Validator等)并不重要.
在我的客户端层,我也有一个标准设置,我不使用域实体本身,而是将它们映射到我的视图层使用的ViewModels(aka DTO):
public class ProductViewModel
{
public int Id { get; set; }
public string Name { get; set; } …Run Code Online (Sandbox Code Playgroud) 我对如何在ASP.NET MVC 2.0 R2上使用新的强类型Html.DropDownListFor帮助程序感到十分迷茫和困惑
在我写的视图中:
<%= Html.DropDownListFor(m => m.ParentCategory, new SelectList(Model.Categories, "CategoryId", "Name", Model.ParentCategory), "[ None ]")%>
<%= Html.ValidationMessageFor(m => m.ParentCategory)%>
Run Code Online (Sandbox Code Playgroud)
因此我的Model对象是:
public class CategoryForm : FormModelBase
{
public CategoryForm()
{
Categories = new List<Category>();
Categories.Add(new CategoryForm.Category() {
CategoryId = 1,
Name = "CPUs" });
Categories.Add(new CategoryForm.Category() {
CategoryId = 2,
Name = "Memory" });
Categories.Add(new CategoryForm.Category() {
CategoryId = 3,
Name = "Hard drives" });
}
// ...other props, snip... //
public Category ParentCategory { get; set; }
public …Run Code Online (Sandbox Code Playgroud) asp.net-mvc html-helper viewmodel asp.net-mvc-2 drop-down-menu
我正在玩新的MVVM框架 - Vue.js(http://vuejs.org/).
这在简单的示例和演示中非常好,但现在我正在尝试使用多个视图创建大型SPA,并且我意识到框架的文档中没有描述如何执行它的最佳模式.
主要问题是我不知道如何处理不同路径上的视图.
例如,我使用Director(https://github.com/flatiron/director)进行路由,但是如何更改视图?
var booksCtrl = function () {
var booksViewModel = new Vue({
el: '#books'
data: { ... }
ready: function () {
// hide previous ViewModel and display this one??
}
});
};
var editBookCtrl = function (id) {
var editBookViewModel = new Vue({
el: '#editBook'
data: { ... }
ready: function () {
// hide previous ViewModel and display this one??
}
});
};
var routes = …Run Code Online (Sandbox Code Playgroud) viewmodel ×10
asp.net-mvc ×6
mvvm ×3
android ×1
controller ×1
data-binding ×1
dto ×1
html-helper ×1
ios ×1
javascript ×1
model ×1
router ×1
validation ×1
viewbag ×1
vue.js ×1