ASP.NetMVC用于动态视图数据/表单的编辑器模板可以检索来自其他服务的编辑,因此在视图中编辑的属性列表是完全动态的,在编译时是未知的。我编写了一些部分视图和HTML帮助器,它们迭代从其他服务检索到的组和属性。现在我必须为各种属性类型构建标记,并且想为什么不重新使用MVC编辑器模板系统呢?支持各种数据类型(例如复选框等),甚至可以使用我的自定义模板进行自定义。到目前为止一切顺利,但如何使用Html.EditorFor()或Html.Editor()获取自定义数据对象/属性?在不使用静态类型数据作为视图模型的情况下构建动态表单的含义。这是我的HTML帮助程序代码的一个简约示例:...}属性“字段”是我从外部服务获得的字段。它有一个对象类型的“值”属性。我喜欢为这个属性类型构建编辑器代码。据我所知,编辑器模板是基于当前视图模型构建的。我可以将另一个对象作为模型传递给当前视图模型吗(如上面的示例“字段”)?任何帮助都会很棒!干杯,马克我的第一个ASPMVC任务涉及构建一个动态表单,这并不简单。基本上你不能使用内置的帮助器或验证,因为它们需要强类型的对象。我的视图基本上遍历输入字段,检查数据类型(bool、int、string、datetime等)并直接为该类型构建编辑器。您还必须手动执行所有验证,用属性装饰类型来执行此操作不起作用,请参阅我的问题if(ModelState.IsValid)isincompatiblewithFormsCollection。用什么代替?RazorView逻辑(我们使用DevExpressMVC扩展,但你会有所偏差)表单对象及其Fields集合是我们的自定义对象,用于描述表单的外观(页面收集搜索条件,这就是你在条件的代码和名称的搜索类型原因)。@foreach(varfieldinform.Fields){@if(field.IsVisible){@Html.DevExpress().Label(s=>s.Text=field.Caption).GetHtml()@if(field.Type==typeof(bool)){@Html.CheckBox(s=>{s.Checked=field.IsBoolSet;s.Name=field.Name;s.ClientEnabled=!field.IsReadonly;}).GetHtml()}否则如果(field.Type==typeof(DateTime)){Html.DevExpress().DateEdit(s=>{s.Name=field.Name;s.ClientEnabled=!field.IsReadonly;if(!string.IsNullOrEmpty(field.Value)){DateTimedateValue;if(DateTime.TryParse(field.Value,outdateValue))s.Date=dateValue;}}).GetHtml();}elseif(field.ListValues.Count>0){Html.DevExpress().ListBox(s=>{s.Name=field.Name;s.ClientVisible=field.IsVisible;s.ClientEnabled=!field.IsReadonly;s.Properties.SelectionMode=DevExpress.Web.ASPxEditors.ListEditSelectionMode.CheckColumn;s.Properties.TextField="Name";s.Properties.ValueField="Value";s.Properties.ValueType=typeof(string);//s.属性.EnableClientSideAPI=true;foreach(variteminfield.ListValues){s.Properties.Items.Add(item.Name,item.Value);}//s.Properties.ClientSideEvents.SelectedIndexChanged="MultiSelectListChanged";s.属性。ClientSideEvents.Init="MultiSelectListInit";}).GetHtml();}else{//Html.TextBox(field.Name,field.Value)Html.DevExpress().TextBox(s=>{s.Name=field.Name;s.Text=field.Value;}).GetHtml();}@Html.ValidationMessage(field.Name)@Html.DevExpress().CheckBox(s=>{s.Checked=field.IncludeInSearch;s.Name="use_"+field.Name;s.ClientEnabled=(!field.IsMandatory);}).GetHtml()}}控制器操作接受FormsCollection我循环遍历formsCollection寻找我在视图中指定的控件名称。[HttpPost]publicActionResultQueryCriteria(FormCollectionformCollection){varisValid=true;foreach(varfieldinform.Fields){varvalue=(formCollection[field.Name]??"").Trim();...如果有任何验证错误,我可以通过将ModelError直接添加到模型来指定控制级别验证,例如ModelState.AddModelError(field.Name,"这是必填字段");如果存在验证错误,我将返回视图。希望这可以帮助。以上就是C#学习教程:ASP.NetMVCEditorTemplateforDynamicViewData/Form分享的全部内容。如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处:
