我是ASP.NET MVC的新手.我在理解ViewModel的目的时遇到了问题.
什么是ViewModel,为什么我们需要一个用于ASP.NET MVC应用程序的ViewModel?
如果我能有一个简单的例子,那就更好了.
我正在使用Automapper,我有以下场景:类OrderModel有一个名为'ProductName'的属性,它不在数据库中.所以当我尝试使用以下方法进行映射时:
Mapper.CreateMap<OrderModel, Orders>();
Run Code Online (Sandbox Code Playgroud)
它会生成一个异常:
"Project.ViewModels.OrderModel上的以下1个属性未映射:'ProductName'
我已经阅读了AutoMapper的Wiki for Projections相反的情况(额外的属性在目的地,而不是在源,这实际上是我的情况)
如何避免使用automapper来映射此属性?
嘿我想让我的ViewModel工作,但到目前为止没有运气.Android Studio显示错误Cannot resolve symbol 'ViewModelProviders'.
我在这个题目中找到的每个其他问题被修正extends Activity到extends AppCompatActivity,但我延长正确的.不确定我错过了什么...
我的代码基于此YouTube视频
MainActivity.java
public class MainActivity extends AppCompatActivity implements
TileAdapter.TileAdapterOnClickHandler {
private BaseViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//set Toolbar
Toolbar myToolbar = findViewById(R.id.toolbar);
setSupportActionBar(myToolbar);
//initialize viewModel
viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);
Run Code Online (Sandbox Code Playgroud)
BaseViewModel.java
public class BaseViewModel extends ViewModel {
private Movie[] mMovie;
public void init (Movie[] movies){
this.mMovie = movies;
}
public Movie[] getMovie() {
return mMovie;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用NHibernate来保存我的域对象.为了简单起见,我将ASP.NET MVC项目用作表示层和服务层.
我想从我的控制器类返回XML中的域对象.在Stack Overflow上阅读了一些帖子后,我收集DTO是可行的方法.但是,我也遇到过有关ViewModel的帖子.
我的问题:数据传输对象和ViewModels是一样的吗?或者ViewModel是DTO的一种子模式?
我有2个型号:
public class Person
{
public int PersonID { get; set; }
public string PersonName { get; set; }
}
public class Order
{
public int OrderID { get; set; }
public int TotalSum { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想在SINGLE视图中编辑BOTH类的对象,所以我需要这样的东西:
@model _try2models.Models.Person
@model _try2models.Models.Order
@using(Html.BeginForm())
{
@Html.EditorFor(x => x.PersonID)
@Html.EditorFor(x => x.PersonName)
@Html.EditorFor(x=>x.OrderID)
@Html.EditorFor(x => x.TotalSum)
}
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用:.cshtml文件中只允许一个"模型"语句.可能有一些解决方法吗?
好的,我一直听到有关MS的ASP.NET MVC的"ViewModels"的讨论.
现在,这是一种特定的模型,对吗?不是特定的视图.
根据我的理解,它是一种具有与View交互的特定目的的模型?或类似的东西?
一些澄清将不胜感激.
互联网上使用ViewModels并使用Automapper的每篇文章都提供了"Controller - > View"方向映射的指导.您将域模型与所有选择列表一起放入一个专门的ViewModel并将其传递给视图.这很清楚也很好.
视图有一个表单,最终我们处于POST操作中.这里所有的模型绑定器与[显然]另一个视图模型一起来到现场,它显然与原始的ViewModel 相关,至少在命名约定方面是为了绑定和验证.
如何将其映射到您的域模型?
让它成为插入动作,我们可以使用相同的Automapper.但如果是更新动作怎么办?我们必须从Repository中检索我们的Domain Entity,根据ViewModel中的值更新它的属性并保存到Repository.
附录1(2010年2月9日):有时,分配模型的属性是不够的.应根据View Model的值对域模型采取一些措施.即,应该在域模型上调用一些方法.可能应该有一种位于Controller和Domain之间的应用服务层,以便处理View Models ...
如何组织此代码以及将其放置在何处以实现以下目标?
asp.net-mvc domain-driven-design separation-of-concerns viewmodel automapper
最近我正在探索谷歌最近推出的Android架构.从文档中我发现了这个:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<Users>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// do async operation to fetch users
}
}
Run Code Online (Sandbox Code Playgroud)
活动可以按如下方式访问此列表:
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在loadUsers()我正在异步获取数据的函数中,我将首先检查数据库(Room)中的数据,如果我没有得到数据,我将进行API调用以从Web服务器获取数据.然后我将获取的数据插入数据库(Room)并根据数据更新UI.建议的方法是什么?
如果我开始Service从loadUsers()方法中调用API ,我该如何更新MutableLiveData<List<User>> users …
android background-service viewmodel android-room android-architecture-components
有没有办法将其他参数传递给我的自定义AndroidViewModel构造函数,除了Application上下文.例:
public class MyViewModel extends AndroidViewModel {
private final LiveData<List<MyObject>> myObjectList;
private AppDatabase appDatabase;
public MyViewModel(Application application, String param) {
super(application);
appDatabase = AppDatabase.getDatabase(this.getApplication());
myObjectList = appDatabase.myOjectModel().getMyObjectByParam(param);
}
}
Run Code Online (Sandbox Code Playgroud)
当我想要使用我的自定义ViewModel类时,我在我的片段中使用此代码:
MyViewModel myViewModel = ViewModelProvider.of(this).get(MyViewModel.class)
Run Code Online (Sandbox Code Playgroud)
所以我不知道如何将额外的参数传递String param给我的自定义ViewModel.我只能传递Application上下文,但不能传递其他参数.我真的很感激任何帮助.谢谢.
编辑:我添加了一些代码.我希望现在好多了.
我一直在尝试在 Activity 中创建 ViewModel 对象,但不推荐使用 ViewModelProviders 那么创建 ViewModel 对象的替代方法是什么。
viewmodel ×10
android ×4
asp.net-mvc ×4
android-architecture-components ×2
automapper ×2
model ×2
android-room ×1
c# ×1
dto ×1
mvvm ×1