FineUI 官方论坛

标题: 【关注中】【建议】多级模型,UIHelper返回数据出错。 [打印本页]

作者: KK.Leung    时间: 2018-12-4 17:22
标题: 【关注中】【建议】多级模型,UIHelper返回数据出错。
我的数据模型是多级模型,像
  1. public class Item
  2.     {
  3.         public b_info Info{get;set;}
  4.         public b_detail Detail{get;set;}
  5.     }

  6. public class b_info
  7.     {
  8.         public int ID{get;set;}
  9.         public string Name{get;set;}
  10.         public int CategoryID{get;set;}//分类ID
  11.     }
复制代码
例如有一个二级类别,需要跟据一级类别联级更新
  1. F.DropDownListFor(k => k.Info.CategoryID).Label("二级类别").BoxFlex(1).ShowRedStar(true).Required(true)
复制代码

当这个DropDownList 不给ID属性时JS可以直接用F.ui["Info.CategoryID"]获取并进行其他操作
但现在问题是用F.doPostBack进行更新数据时
  1. UIHelper.DropDownList("Info.CategoryID").LoadData(categoryArray); //这是Controller的内容
复制代码
返回的数据却是
  1. F.ui.Info.CategoryID.loadData(..省略数据);
复制代码
这样JS就会报错,因为没找到F.ui.Info,也没有CategoryID这个属性

如果返回的数据改成
  1. F.ui["Info.CategoryID"].loadData(..省略数据);
复制代码
就可以顺利加载到ID为“Info.CategoryID”的DropDownList,其实这个F.DropDownListFor直接加ID就可以完事了,但这样就失去绑定模型的意义,上下文模型的Info.CategoryID的值就要单独处理
作者: KK.Leung    时间: 2018-12-4 18:05
本帖最后由 KK.Leung 于 2018-12-4 18:08 编辑
  1. var dateStr = string.Empty;
  2. categoryList.ForEach(k => dateStr += $"["{k.Value}","{k.Text}",1,"",""],");
  3. PageContext.RegisterStartupScript($"F.ui['Info.CategoryID'].loadData([{dateStr.TrimEnd(',')}]);");
  4. return UIHelper.Result();
复制代码

目前的处理办法

[attach]11720[/attach]

作者: sanshi    时间: 2018-12-5 23:03
这个问题很好。

由于DOM节点中ID不能包含点号,所以我考虑是否把 Info.CategoryID 替换为 Info_CategoryID ??? 这个回头要仔细测试下
作者: KK.Leung    时间: 2018-12-6 08:25
本帖最后由 KK.Leung 于 2018-12-6 08:27 编辑
sanshi 发表于 2018-12-5 23:03
这个问题很好。

由于DOM节点中ID不能包含点号,所以我考虑是否把 Info.CategoryID 替换为 Info_CategoryID ...

首先感谢你的关注~
  1. F.DropDownListFor(k => k.Info.CategoryID).Label("二级类别")
复制代码
  1. DropDownListExtension DropDownListFor<TValue>(Expression<Func<TModel, TValue>> expression);
复制代码

跟据文档,所有结尾为For,如【DropDownListFor】、【CheckBoxFor】、【TextBoxFor】都是用Expression<Func<TModel, TValue>> expression,如你所说用Info_CategoryID代替Info.CategoryID 符合 Expression<Func<TModel, TValue>> expression 表达式?
作者: sanshi    时间: 2018-12-6 09:39
KK.Leung 发表于 2018-12-6 08:25
首先感谢你的关注~

当然这个地方不能改:
  1. F.DropDownListFor(k => k.Info.CategoryID).Label("二级类别")
复制代码


这是 C# 代码。

我本来意思是渲染到前台的ID用 Info_CategoryID 替换 Info.CategoryID,不过我还没详细测试,只是暂时的想法
作者: KK.Leung    时间: 2018-12-6 10:29
sanshi 发表于 2018-12-6 09:39
当然这个地方不能改:

[attach]11726[/attach]
我认为比较简单粗暴的方法就是把 返回时的JS改成
  1. F.ui["ID名称"].XXX
复制代码
这样无论是多少级都没问题
  1. F.ui["一级.二级.三级"].XXX
复制代码



作者: sanshi    时间: 2018-12-6 10:54
KK.Leung 发表于 2018-12-6 10:29
我认为比较简单粗暴的方法就是把 返回时的JS改成
这样无论是多少级都没问题

是的。这个最简单,其实FineUIPro返回的就行:F('ID名称')




欢迎光临 FineUI 官方论坛 (https://www.fineui.com/bbs/) Powered by Discuz! X3.4