当没有值时,我曾经收到空字符串:
[HttpPost]
public ActionResult Add(string text)
{
// text is "" when there's no value provided by user
}
Run Code Online (Sandbox Code Playgroud)
但现在我正在传递一个模型
[HttpPost]
public ActionResult Add(SomeModel Model)
{
// model.Text is null when there's no value provided by user
}
Run Code Online (Sandbox Code Playgroud)
所以我必须使用?? ""运算符.
为什么会这样?
作为一个刚刚开始使用MVC的相当有经验的ASP.Net开发人员,我发现自己正在努力将我的思维方式从传统的"服务器控件和事件处理程序"的处理方式转变为更加动态的MVC方式.我想我正在慢慢地到达那里,但有时MVC"魔法"会让我失望.
我目前的情况是创建一个网页,允许用户浏览本地文件,将其上传到服务器并重复此操作,直到他有一个要使用的文件列表.当他对文件列表(将在页面上的网格中显示)感到满意时,他将单击一个按钮来处理文件并提取将存储在数据库中的一些数据.
最后一部分并不是那么重要,现在我正在努力处理像构建文件列表这样简单的事情,并在请求之间保持该列表.在传统方法中,这将非常简单 - 数据将保存在ViewState中.但是在MVC中我需要在控制器和视图之间传递数据,而我并没有完全了解它应该如何工作.
我想我最好发布我的相当不完整的编码尝试来解释这个问题.
为了保存我的文件列表数据,我创建了一个viewmodel,它基本上是一个类型化的文件列表,还有一些额外的元数据:
public class ImportDataViewModel
{
public ImportDataViewModel()
{
Files = new List<ImportDataFile>();
}
public List<ImportDataFile> Files { get; set; }
...
Run Code Online (Sandbox Code Playgroud)
在视图中,我有一个用于浏览和上传文件的表单:
<form action="AddImportFile" method="post" enctype="multipart/form-data">
<label for="file">
Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
该视图使用viewmodel作为其模型:
@model MHP.ViewModels.ImportDataViewModel
Run Code Online (Sandbox Code Playgroud)
这会将文件发送到我的操作:
public ActionResult AddImportFile(HttpPostedFileBase file, ImportDataViewModel importData)
{
if (file.ContentLength > 0)
{
ImportDataFile idFile = new ImportDataFile { File = file };
importData.Files.Add(idFile);
}
return View("DataImport", importData);
}
Run Code Online (Sandbox Code Playgroud)
此操作返回DataImport页面的视图以及包含文件列表的viewmodel实例.
这可以很好地工作到某一点,我可以浏览文件并上传它,我可以在动作中看到viewmodel数据,然后如果我在视图中放置一个断点并调试"this.Model",一切都是精细.
但是,如果我尝试上传另一个文件,在AddImportFile操作中放置断点时,importData参数为空.因此,视图显然没有将其模型的当前实例传递给操作.
在我经历的MVC示例中,模型实例被"神奇地"传递给action方法作为参数,那么为什么它现在为空呢? …
我很难理解这个词的含义是什么:
Entity,Model,DataModel,ViewModel
任何人都可以帮我理解他们吗?谢谢你们.
我一直在阅读有关用户和自定义控件之间差异的一些解释,例如:http: //www.wpftutorial.net/CustomVsUserControl.html
例如,我想创建一个带有2个组合框的数据网格的简单组合,这些组合框负责更改数据网格项目的值.我想为此创建一个特定的控件,因为我将使用它很多次.我想实现后面的逻辑然后在xaml调用中我只需要指定itemsSource.
对于此示例,我应该创建用户控件还是自定义控件?由于我将拥有属性和逻辑,我应该有一个用于此控件的viewmodel吗?
编辑:你知道一些文章在这两个选项之间有明确的概念分离吗?
我有一个AttributeView包含各种属性的视图.还有一个按钮,按下时,它应该为属性设置默认值.我还有一个ViewModelBase类,它是我所有ViewModel的基类.问题是我似乎无法使用WPF将命令绑定到命令.
我试过这个,但它没有做任何事情:
<Button Command="{Binding DataInitialization}" Content="{x:Static localProperties:Resources.BtnReinitializeData}"></Button>
Run Code Online (Sandbox Code Playgroud)
该命令是在(如下ViewModelBase)中定义的:
public CommandBase DataInitialization { get; protected set; }
Run Code Online (Sandbox Code Playgroud)
在应用程序启动时,为该命令创建一个新实例:
DataInitialization = new DataInitializationCommand()
Run Code Online (Sandbox Code Playgroud)
但是,WPF绑定似乎没有"找到"命令(按下按钮什么都不做).当前视图中使用的ViewModel派生自ViewModelBase.我还能尝试什么(我对WPF很新,所以这可能是一个非常简单的问题)?
我有一个用于创建备忘录的表单,为此我使用富文本编辑器来提供一些样式,这会创建html标签以便应用样式.当我发布该文本时,mvc会抛出错误以防止可能存在危险的脚本,因此我必须特别允许它.
我找到了两种方法,一种是用装饰控制器方法,另一种是用[ValidateInput(false)]它来装饰ViewModel属性[AllowHtml].对我来说,[AllowHtml]看起来更好,但我只发现这种方法使用了1次,[ValidateInput(false)]似乎是首选方式.
我应该使用哪种方法,两者之间有什么区别?
常见的情形:具有项目模型集合的模型.
例如一个有人的集合的房子.
如何正确地为MVVM构造这一点 - 特别是在使用添加和删除更新Model和ViewModel集合方面?
模型House包含模型的集合People(通常为a List<People>).
视图模型HouseVM包含它包装的House对象和视图模型的ObservableCollection PeopleVM(ObservableCollection<PeopleVM>).请注意,我们最终会在HouseVM中保存两个集合(需要同步):
1.2 HouseVM.House.List<People>
.HouseVM.ObservableCollection<PeopleVM>
当House更新为新人(添加)或人员离开(删除)时,现在必须在两个集合中处理该事件: Model House People集合和 VM HouseVM PeopleVM ObservableCollection.
这个结构是否正确MVVM?
反正是否有必要对添加和删除进行双重更新?
我很简单(我希望:))问题:
在MVVM中,View通常会侦听ViewModel属性的更改.但是,我有时会喜欢听事件,例如,当VM发出信号时,View可以启动动画或关闭窗口.
通过带有NotifyPropertyChanged的bool属性(并且只有当它从false变为true时才开始动画)可以做到这一点,但感觉就像是一个hack,我更喜欢暴露事件,因为它在语义上是正确的.
此外,我想在代码隐藏中没有代码的情况下这样做,因为这样做viewModel.myEvent += handler意味着我已经手动取消注册事件以允许View为GC'd - WPF视图已经能够弱地监听属性',而且我更喜欢在View中以声明方式编程.
标准的强事件订阅也很糟糕,因为我需要为一个View切换多个ViewModel(因为每次创建View需要占用太多的CPU时间).
感谢您的想法(如果有标准的解决方案,msdn的链接就足够了)!
这可能是一个愚蠢的问题!(n00b到AutoMapper和时间短!)
我想使用AutoMapper从EF4实体映射到ViewModel类.
1)如果我打电话
CreateMap<ModelClass, ViewModelClass>()
Run Code Online (Sandbox Code Playgroud)
然后我也需要打电话
CreateMap<ViewModelClass, ModelClass>()
Run Code Online (Sandbox Code Playgroud)
执行相反的操作?
2)如果两个类具有相同的属性名称,那么我是否需要一个CreateMap语句,或者这只是针对"特定/自定义"映射?
我目前正在开发一个ASP.NET MVC项目.
团队中的一些开发人员希望将自动生成的数据库实体直接绑定到视图.
其他开发人员希望创建量身定制的ViewModel并将其绑定到Views.
客观地说,这两种方法的优点和缺点是什么?
("数据库实体"我指的是ORM框架生成的自动生成的类,例如LINQ to SQL,Entity Framework或LLBLGen).