【问题标题】:Is it possible to take advantage of the ICommand in an ASP.NET MVC project?是否可以在 ASP.NET MVC 项目中利用 ICommand?
【发布时间】:2014-09-23 18:32:26
【问题描述】:

基本上,我正在创建一个可移植类库,并创建一堆 ViewModel:

public class CustomerViewModel : ViewModelBase
{
    public string FirstName { ... } // INPC
    public string LastName { ... } // INPC

    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }

    public ICommand DoFooCommand { get; private set; } // DelegateCommand

    private bool CanDoFoo(object parameter) { ... }
    private void DoFoo(object parameter) { ... }
}

如果我想要 WinRT 和 WPF 应用程序的可重用性,这很好,但是如何将这个类用于 ASP.NET MVC 网站?似乎无论如何我都必须将这个类所做的所有事情都包装到一个控制器中。此外,ICommand 甚至可用于 ASP.NET MVC 应用程序吗?

我真的不想拥有一个客户端 MVVM javascript 库,它只是我的视图模型的重新编码版本。

【问题讨论】:

  • 好吧,如果你想使用 that ICommand,你必须依赖 WPF 程序集。但是,它只是公开了 CanExecute 和 Execute 方法。所以,从初级的角度来看,是的,你可以在 MVC 中使用它。要将它连接到 HTML 前端,当然不是——它是 .NET,而 HTML 使用 JavaScript。
  • 使用 knockout.js 映射插件是一种非常好的方法,可以大大节省您在 javascript 中重新创建 C# 视图模型的工作
  • MVVM 的可测试性优于可重用性。这种情况很糟糕,必须实施:/
  • @PeterRitchie 从 .NET 4.5 开始,ICommand 位于 System.dll 中,因此您无需引用 WPF 程序集。

标签: c# asp.net-mvc mvvm portable-class-library icommand


【解决方案1】:

在 MVC 视图模型中直接使用它至少是没有意义的和功能失调的。这是因为与 WPF 中的 MVVM 不同,ViewModel 的实例不会在交互(点击、POST 等)之间保留,而是重新创建。因此整个 INPC (INotifyPropertyChanged) 将不起作用。

ICommand 需要根据视图将数据绑定到的其他属性来启用/禁用,但 MVC 中的数据绑定(可以这么说)是一次性的(在渲染时),这也会使这个概念变得无用。

MVVM 和 MVC 不兼容,抱歉。几年前我遇到了同样的问题,试图跨平台重用东西,但我做不到。甚至没有使用 T4(文本模板),我试图将(WPF-ish)ViewModel 类转换为 MVC 更可接受的形式。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2010-11-28
    • 2011-07-11
    相关资源
    最近更新 更多