【问题标题】:Asp MVC3 Custom EditorTemplate for Collections (Empty or Not)用于集合的 Asp MVC3 自定义编辑器模板(是否为空)
【发布时间】:2011-05-22 21:25:07
【问题描述】:

经过大量谷歌搜索、stackoverflowing (?) 和博客阅读后,我仍然无法完全解决问题。希望这个专家社区能来救援!

鉴于: 带有字段 ICollection 的 Company 类(一个 Company 可以有多个地址)。每个地址都有几个简单的字符串字段。

短版:

我希望用户能够向公司添加任意数量的地址。首先,我想显示一组地址文本框,然后显示“添加更多地址”按钮。 Javascript 没有问题,而 mvc 部分。如果不清楚,功能应该与此类似: http://www.mdelrosso.com/sheepit/index.php?lng=en_GB&sec=demo3

我需要使用 MVC EditorForModel() 函数,这意味着所有配置都需要进入编辑器模板。

目前的状态:

  • 为编辑公司页面创建 ViewModel (CompanyViewModel)
  • 将 [UIHint("Addresses")] 添加到字段 public ICollection Addresses { get;放; }
  • 已创建地址编辑器模板

在 Addresses EditorTemplate 中,添加新公司时,传入的模型为 Null(这并不奇怪)。如何为额外地址创建编辑器?我尝试了多个化身(使用 Razor):

@Html.EditorFor(m => new Address());

但即使远程工作也无法生产任何东西。 (上面的确切行给出了错误“模板只能用于字段访问、属性访问、单维数组索引或单参数自定义索引器表达式。”)

感谢您的指点!

/维克多

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 collections editortemplates


    【解决方案1】:

    这是当前 API 的一个缺点。一种方法是创建一个负责生成插入表单的子操作

    在您的控制器中:

    [ChildActionOnly]
    public ActionResult AddAddress() {
        return View(new Address()); // pass an instance so view works
    }
    

    添加新视图AddAddress.cshtml

    @model Address
    @Html.EditorForModel()
    

    然后在你的编辑器模板中使用

    @Html.Action("AddAddress")
    

    【讨论】:

    • 嗯好的...不过谢谢您的回答!当模型是“new Address()”时编写 @Html.EditorForModel()(或 @Html.EditorFor(model => model))和编写 EditorFor(m => new Address) 有什么区别?如果没有这种“hacky”方法,真的没有办法做到这一点吗?更具体地说是在 Api 中阻止调用?
    • 不同之处在于EditorFor分析传入的lambda表达式。它拒绝您与构造函数一起使用的那个。这只是 Mbc 的一个限制,我们将在未来的版本中寻求解决。
    • 好的,感谢您的澄清。我想我会使用你的建议。
    • 在您的解决方案中,Address 在发布回控制器时与父对象具有相同的Id。假设控制器看起来像public ActionResult Add(Person person, Address address),除非我误解了什么。
    猜你喜欢
    • 2018-10-08
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多