如何实现ASP.NET MVC自定义模型绑定

分号 2017-06-22 09:44:29
先贴模型定义:
    
public class TestModel
{
[Required]
public Guid MyId { get; set; }
[Required]
public LedSizeModel LedSize { get; set; }
}

public class LedSizeModel
{
public int Left { get; set; }
public int Top { get; set; }
public int Width { get; set; }
public int Height { get; set; }
}

假如按默认的编码:

@Html.EditorFor(model => model.LedSize, new { htmlAttributes = new { @class = "form-control" } })

就会生成如下图所示的界面:

但是我不想为 LedSizeModel 类型生成4个输入框,我想实现下图所示的界面:

在这个界面中,我按字符串形式填写left,top,width,height的值,然后再通过代码来处理。

但是我不知道究竟要做哪些编码才能实现,请问谁能大致指导指导?
...全文
250 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SummerZYQ 2017-06-22
  • 打赏
  • 举报
回复
js处理数据,ajax请求。 还有楼上说的方法都行。 其他方法想不到了
正怒月神 版主 2017-06-22
  • 打赏
  • 举报
回复
那你就在model中增加一个属性 增加NotMapped是因为,他不属于数据库映射字段 [NotMapped] LEDValue 然后前台绑定这个LEDValue,后台接收到后,split分别赋值给Left,Top.....
分号 2017-06-22
  • 打赏
  • 举报
回复
方法确实很多,感谢楼上各位,我自己摸索了半天又实现了一种方法,如下所示:

        public static MvcHtmlString EditorLedSizeFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelpr, Expression<Func<TModel, TValue>> expression, 
            object htmlAttributes)
        {
            var tmp = ModelMetadata.FromLambdaExpression(expression, htmlHelpr.ViewData);

            if (tmp.ModelType != typeof(LedSizeModel))
            {
                throw new InvalidCastException(string.Format("不能将{0}转换为{1}", tmp.ModelType.ToString(), typeof(LedSizeModel).ToString()));
            }

            string modelName = ExpressionHelper.GetExpressionText(expression);

            TagBuilder tagBuilder = new TagBuilder("input");
            tagBuilder.Attributes.Add("type", "text");
            tagBuilder.Attributes.Add("name", modelName);

            var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
            if (attributes.ContainsKey("htmlAttributes"))
            {
                var attr = HtmlHelper.AnonymousObjectToHtmlAttributes(attributes["htmlAttributes"]);
                if (attr.ContainsKey("class"))
                {
                    attr["class"] = "text-box single-line " + attr["class"];
                }
                else
                {
                    attr.Add("class", "text-box single-line");
                }

                tagBuilder.MergeAttributes(attr, false);
            }

            LedSizeModel tmpModel = (LedSizeModel)tmp.Model;
            tagBuilder.Attributes.Add("value", string.Format("{0},{1},{2},{3}", tmpModel.Left, tmpModel.Top, tmpModel.Width, tmpModel.Height));

            return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing));
        }
然后在View里如下调用就可以了:

@Html.EditorLedSizeFor(model => model.LedSize, new { htmlAttributes = new { @class = "form-control" } })
当然,还有一些后续的工作,例如客户端验证输入等,实现 ValidationAttribute 这个特性,就可以自定义模型验证了。
  • 打赏
  • 举报
回复
http://blog.csdn.net/wangzl1163/article/details/52485298 希望这篇文章能给你启发

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧