FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 3149|回复: 6

【关注中】【建议】多级模型,UIHelper返回数据出错。

[复制链接]
发表于 2018-12-4 17:22:03 | 显示全部楼层 |阅读模式
我的数据模型是多级模型,像
  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的值就要单独处理
 楼主| 发表于 2018-12-4 18:05:37 | 显示全部楼层
本帖最后由 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();
复制代码

目前的处理办法


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
发表于 2018-12-5 23:03:29 | 显示全部楼层
这个问题很好。

由于DOM节点中ID不能包含点号,所以我考虑是否把 Info.CategoryID 替换为 Info_CategoryID ??? 这个回头要仔细测试下
 楼主| 发表于 2018-12-6 08:25:49 | 显示全部楼层
本帖最后由 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 表达式?
发表于 2018-12-6 09:39:33 | 显示全部楼层
KK.Leung 发表于 2018-12-6 08:25
首先感谢你的关注~

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


这是 C# 代码。

我本来意思是渲染到前台的ID用 Info_CategoryID 替换 Info.CategoryID,不过我还没详细测试,只是暂时的想法
 楼主| 发表于 2018-12-6 10:29:11 | 显示全部楼层
sanshi 发表于 2018-12-6 09:39
当然这个地方不能改:


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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
发表于 2018-12-6 10:54:56 | 显示全部楼层
KK.Leung 发表于 2018-12-6 10:29
我认为比较简单粗暴的方法就是把 返回时的JS改成
这样无论是多少级都没问题

是的。这个最简单,其实FineUIPro返回的就行:F('ID名称')
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-3-28 22:07 , Processed in 0.049611 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表