在ASP.NET MVC项目中是否可以利用ICommand?

4
基本上,我正在创建一个可移植类库,并创建一堆视图模型:
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库,它只是我的视图模型的重新编码版本。

如果您想使用那个ICommand,就必须依赖于WPF程序集。但是,它只公开了CanExecute和Execute方法。因此,从基本层面上讲,您可以在MVC中使用它。当然,要将其连接到HTML前端是不可能的——这是.NET,而HTML使用JavaScript。 - Peter Ritchie
使用 knockout.js 映射插件是一个非常好的方法,可以大大节省您在 JavaScript 中重新创建 C# 视图模型的工作。 - Jedediah
MVVM比可重用性更适合测试。这种情况实现起来会很糟糕 :/ - user1228
1
@PeterRitchie 从.NET 4.5开始,ICommand已经在System.dll中了,所以您不需要引用WPF程序集。 - Daniel Plaisted
1个回答

1
直接在MVC视图模型中使用这种方法至少是无意义的且功能失调的。这是因为与WPF中的MVVM不同,ViewModel的实例不会跨交互(点击、POST等)保留,而是重新创建。因此,整个INPC(INotifyPropertyChanged)将无法工作。
ICommand需要基于其他属性启用/禁用,这些属性将与视图进行数据绑定,但MVC中的数据绑定(可以这么说)是一次性的(在渲染时),这将使这个概念变得无用。
MVVM和MVC不兼容,很抱歉。几年前我遇到了同样的问题,试图在平台间重用东西,但我失败了。即使使用T4(文本模板)将(类似WPF的)ViewModel类转换为更可接受的形式,也不行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接