标签: viewmodel

ASP.NET MVC中的平面与嵌套ViewModel类

我正在寻找关于ViewModel定义的两种不同方法的一些看法

我有一个公司课

public class Company
{
    public string Name { get; set; }
    public int CountryID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

对于"创建"和"编辑"视图,我需要一个国家/地区列表来填充DropDownList以进行CountryID选择.我可以看到如何构建ViewModel的两个广泛选择,详见下文.

嵌套的ViewModel

public class CompanyCreateEditViewModel
{
    public Company Company { get; set; }
    public IEnumerable<Country> Countries{ get; set; }
....
}
Run Code Online (Sandbox Code Playgroud)

平面ViewModel

public class CompanyCreateEditViewModel
{
    public string Name { get; set; }
    public int CountryID { get; set; }
    public IEnumerable<Country> Countries{ get; set; }
....
}
Run Code Online (Sandbox Code Playgroud)

目前我赞成使用嵌套方法,因为它使我免于第二次定义字段,但我想把它打开以获得更好的方法和评论.

谢谢

asp.net-mvc viewmodel

31
推荐指数
2
解决办法
5741
查看次数

'by viewModels()' Kotlin 属性委托未解析的引用

我正在尝试使用 kotlin 实现视图模型。首先,我添加了所需的依赖项:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
// Annotation processor
kapt "androidx.lifecycle:lifecycle-compiler:2.2.0"
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个简单的视图模型:

class MyViewModel: ViewModel() {
    val greeting = "Hello World"
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用 kotlin 属性委托从活动访问视图模型时:

val model by viewModels<MyViewModel>()
Run Code Online (Sandbox Code Playgroud)

编译器不解析viewModels. 我不知道是什么问题。我错过了什么?

android viewmodel kotlin

31
推荐指数
4
解决办法
8026
查看次数

WPF MVVM单元测试ViewModel?

我一直在阅读使用MVVM的好处,尤其是单元测试.所以,现在我需要为我的ViewModel编写单元测试.有没有人有这方面的例子?我应该使用VS2008生成单元测试并选择那些看似重要的测试吗?

wpf unit-testing mvvm viewmodel

30
推荐指数
0
解决办法
3万
查看次数

MVC 3形成帖子和持久模型数据

我想我错过了关于MVC表单如何工作的一些基础知识.我的主页上有一个搜索表单,其中有五六个不同的字段供用户搜索.所以我对我的结果动作进行了这个POST就好了.Result操作如下所示:

[HttpPost]
public ActionResult Results(SearchModel model)
{
    ResultsModel results = new ResultsModel();
    results.ResultList = SearchManager.Search(model).ToList();

    return View("Results", results);
}
Run Code Online (Sandbox Code Playgroud)

我为这篇文章简化了上面的方法,但想法是一样的.所以一切正常.我的结果页面显示结果列表,我的用户位于以下URL:

http://www.site.com/results

所以...现在我想做一些相当普遍的事情.我在结果页面上有两个下拉列表."排序依据"和"每页结果数".我该怎么做并将全套模型数据发送回控制器,以便我可以查询新参数?实际上,SearchModel类有大约60个不同的字段.可能所有这些数据都可以包含在模型中.你如何坚持到"回帖"的页面?

同样的问题让我对如何进行分页感到有点困惑.我的分页链接将转到以下URL:

http://www.site.com/results/2

但是这假设我们正在响应GET请求(我不想在查询字符串中使用60个数据字段)并且模型数据在GET请求之间传递,我知道情况并非如此.

正如我所说的,我认为我缺少一些关于使用MVC 3,模型和表单帖子的基础知识.

任何人都可以帮助我指出正确的方向吗?我很乐意根据需要编辑/更新这篇文章以澄清事情.

编辑:我也想指出,我想避免将视图模型存储在Session变量中.这个站点最终将最终在Web场中进行负载平衡,并且我真的试图避免在可能的情况下使用Session.但是,如果它是唯一的选择,我将配置另一个会话状态提供程序,但我不想这样做.

c# forms asp.net-mvc viewmodel

28
推荐指数
2
解决办法
6万
查看次数

WPF - 用户控件是否应该拥有自己的ViewModel?

我有一个由几个用户控件组成的窗口,并且想知道每个用户控件是否有自己的ViewModel,或者整个窗口是否只有一个ViewModel?

wpf model-view-controller viewmodel

27
推荐指数
4
解决办法
1万
查看次数

我为什么要使用视图模型?

我是使用ASP.NET MVC开发Web应用程序的新手.事实上,无论技术如何,我都很擅长开发网络应用程序.

目前,我正在开展一个项目,以便更好地了解ASP.NET MVC框架.当阅读SO和互联网上的其他地方时,共识似乎是视图永远不应直接处理业务对象(即实现业务逻辑和包含相关属性的对象).相反,应该使用视图模型.但是,这引入了一些问题:

  • 我在哪里放置验证码?
  • 我需要添加代码来映射业务对象和视图模型.

事实上,它似乎相当麻烦,我没有真正看到任何人正确解释为什么将业务对象传递给视图是一个坏主意.有人可以尝试解释一下(或指向一个很好的解释)?

只是一个澄清 ; 我不是在寻找如何处理上述视图模型的两个问题的示例,而只是解释为什么我应该使用视图模型.

asp.net-mvc viewmodel

27
推荐指数
2
解决办法
9642
查看次数

Domain vs DTO vs ViewModel - 如何以及何时使用它们?

在具有域层(DL)/业务(服务)层(BL)/表示层(PL)的多层项目中,将实体传递到表示层的最佳方法是什么?

DO => Domain Object;
DTO = Domain Transfer Object;
VM => View Model;
V => View;
Run Code Online (Sandbox Code Playgroud)

选项1:

DL => DO => BL => DTO => PL => VM => V
Run Code Online (Sandbox Code Playgroud)

这个选项似乎是最佳实践,但似乎也很重要.

选项2:

DL => DO => BL => DTO => PL => V
Run Code Online (Sandbox Code Playgroud)

这个选项似乎不是很好的练习,但由于DTO与VM几乎完全相同,我们可以将它直接传递给View,实现和保护它不那么痛苦.

这个选项对于多个布局也是可靠的吗,例如,对于移动设备,我可能需要来自BL的较少信息,因此我需要为这个特定布局使用不同的VM?

asp.net-mvc entity-framework dto viewmodel automapper

27
推荐指数
2
解决办法
1万
查看次数

ArgumentMatchers.any 不能为空

我正在尝试测试ViewModel以确保 livedata 正确更新。但是,当使用ArgumentMatchers.any()它失败时IllegalStateException说:

ArgumentMatchers.any(mViewModel.CountSubscriber::class.java) 不能为空

@Test
fun emitValueIfCountIs7() {
    doAnswer { invocation: InvocationOnMock ->
        val subscriber: mViewModel.CountSubscriber = invocation.getArgument(0)
        subscriber.onNext(7)
        null
    }.`when`(countUseCase).execute(
        ArgumentMatchers.any(mViewModel.CountSubscriber::class.java),
        ArgumentMatchers.any(Parameters::class.java)
    )
    
    // When
    mViewModel.getCount()
    
    // Verify
    assert(mViewModel.countResponse.value != null)
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Kotlin 并具有以下依赖项:

testImplementation 'junit:junit:4.12'
testImplementation "org.mockito:mockito-inline:2.23.4"
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0"
Run Code Online (Sandbox Code Playgroud)

这是我的进口:

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.nhaarman.mockitokotlin2.doAnswer
import io.reactivex.Observable
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.ArgumentMatchers.any
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations
import org.mockito.invocation.InvocationOnMock
Run Code Online (Sandbox Code Playgroud)

奇怪的是它以前可以工作,我不知道发生了什么可能会影响它。

android unit-testing mockito viewmodel kotlin

27
推荐指数
4
解决办法
1万
查看次数

在ViewModel构建期间或之后MVVM加载数据?

我的通用问题是标题所述,是否最好在ViewModel构造期间或之后通过某些Loaded事件处理加载数据?

我猜测答案是在构建之后通过一些Loaded事件处理,但我想知道ViewModel和View之间如何最清晰地协调?

这里有关于我的情况以及我想要解决的特定问题的更多细节:

我正在使用MVVM Light框架以及Unity for DI.我有一些嵌套的视图,每个视图都绑定到相应的ViewModel.ViewModel通过Laurent Bugnion放入MVVM Light的ViewModelLocator理念绑定到每个View的根控件DataContext.这允许通过静态资源查找ViewModels并通过依赖注入框架控制ViewModels的生命周期,在本例中为Unity.它还允许Expression Blend查看与ViewModel相关的所有内容以及如何绑定它们.

所以无论如何,我有一个父View,它有一个ComboBox数据绑定到其ViewModel中的ObservableCollection.ComboBox的SelectedItem也绑定(双向)到ViewModel上的属性.当ComboBox的选择发生变化时,这将触发其他视图和子视图中的更新.目前我正在通过MVVM Light中的Messaging系统实现这一目标.当您在ComboBox中选择不同的项目时,这一切都非常有效.

但是,ViewModel通过一系列初始化方法调用在构造期间获取其数据.如果我想控制ComboBox的初始SelectedItem是什么,这似乎只是一个问题.使用MVVM Light的消息传递系统,我目前已经设置了ViewModel的SelectedItem属性的setter是广播更新的设置者,另一个感兴趣的ViewModels注册用于它们的构造函数中的消息.看来我正在尝试在构造时通过ViewModel设置SelectedItem,这样就不允许构建子ViewModel并进行注册.

在ViewModel中协调数据加载和SelectedItem初始设置的最简洁方法是什么?我真的很想坚持在View的代码隐藏中尽可能少地使用合理的代码.我想我只需要一种方法让ViewModel知道什么时候有东西已经加载,然后它可以继续加载数据并完成设置阶段.

在此先感谢您的回复.

data-binding constructor onload viewmodel mvvm-light

26
推荐指数
2
解决办法
2万
查看次数

为什么两个类,视图模型和域模型?

我知道将域模型用作视图模型可能会很糟糕.如果我的域模型有一个名为IsAdmin的属性并且我有一个Create控制器操作来创建用户,那么即使我没有在我的视图中公开这样的文本字段,也有人可以改变我的表单并使其发布一个IsAdmin = true表单值. .如果我正在使用模型绑定,那么当我提交我的域模型时,该人现在将成为管理员.因此,解决方案只是在视图模型中公开我需要的属性,并使用AutoMapper之类的工具将我返回的视图模型对象的属性值映射到我的域模型对象的属性值.但是我读到类上的bind属性可以用来指示Model Binder它应该和不应该绑定哪些属性.那么究竟是什么原因使得两个独立的类(领域模型和视图模型)必须代表相同的东西,然后在映射它们时增加开销呢?这是一个代码组织问题,如果是这样,我如何受益?

编辑

我遇到的与域模型分离的视图模型的最重要原因之一是需要实现MVVM模式(基于Martin Fowler的PM模式)来管理复杂的UI.

model modelbinders viewmodel asp.net-mvc-3

26
推荐指数
2
解决办法
2万
查看次数