【问题标题】:Allow to use to add an item to model asp.net mvc4允许用于向模型 asp.net mvc4 添加项目
【发布时间】:2014-09-30 12:18:02
【问题描述】:

型号:

public class oPage
{
    public int PageId { get; set; }
    public List<oContent> Contents { get; set; }
}

oContent 对象具有属性:IdText

视图:(剃刀)

@for (int i = 0; i <= Model.Agrees.Count; i++)
{
   @Html.TextAreaFor(m => Model.Agrees[i].Text)
}

我想让用户从客户端添加其他内容。

我发现了一些我不喜欢的解决方案:

  1. 手动编写 html 标记。我不喜欢它,因为也许有一天渲染的结构会改变,而我的代码不会说话。 (喜欢这里:http://www.techiesweb.net/asp-net-mvc3-dynamically-added-form-fields-model-binding/

  2. 从服务器获取结构。我不喜欢这个,因为……好吧,除非必须,否则我总是不喜欢使用服务器。 (喜欢这里:How to add items to MVC model in javascript?

我正在寻找更好、更智能的解决方案。

【问题讨论】:

  • 我不同意你不关注这些文章的理由。
  • 为什么不呢?你能解释一下吗?
  • 您将对 HTML 进行的小 DOM 操作,即。添加一个新的表格行,我认为在可预见的将来不会改变它会破坏你的代码,HTML 是相当标准的。关于第二点,按照文章中的描述去服务器添加新项目没有错
  • 1.问题不在于操纵。我希望渲染“真实”项目的同一引擎将渲染“模板”。如果由于某种原因(更新框架或其他原因)属性结构会发生变化,那么它将是有问题的。 2.当我必须去服务器时,我会这样做。但是为了得到我可以首先渲染的东西,这似乎是一种浪费。

标签: javascript asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

解决方案有点复杂,但我认为它涵盖了我的所有观点。

逻辑是:

  1. 从 razor 引擎获取 html

    @Html.TextAreaFor(m => Model.Agrees[i].Text).ToHtmlString()
    
  2. 比用属性名和id替换索引号(比依赖所有属性值更有意义)

    public static string CreateHelperTemplate(string PlaceholderPerfix, MvcHtmlString mvcHtmlString)
    {
        string Result = "";
        XElement TempNode = XDocument.Parse(mvcHtmlString.ToHtmlString()).Root;
    
        XAttribute AttrId = TempNode.Attribute("id");
        AttrId.Value = AttrId.Value.Replace("0", PlaceholderPerfix);
    
        XAttribute AttrName = TempNode.Attribute("name");
        AttrName.Value = AttrName.Value.Replace("0", PlaceholderPerfix);
    
        // Clear the content if exist
        TempNode.SetValue(string.Empty);
    
        Result = TempNode.ToString();
    
        return Result;
    }
    
  3. 结果是这样的:

    <textarea class="form-control" cols="20" id="Perfix_$__Text" name="Agrees[$].Text" rows="2"></textarea>
    
    1. 然后,在 javascript 中,当用户单击“添加项目”按钮时,您可以获得“模板”和索引,并将“$”替换为索引。

所以,我不需要调用服务器,如果助手的结构会改变我的代码仍然可以工作。

它正在工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多