创建重复HTML部分的更好方法

时间:2014-06-06 10:37:38

标签: asp.net-mvc

之前我曾经问过这个,但是没有任何代码可以看,这里我有一个实现,我想知道是否有更好的方法来实现这一点。

我想要一个重复的html部分:

<div>
  <input id=id1 name=id1 type=text/>
</div>
<div>
  <input id=id2 name=id2 type=text/>
</div
etc

这可能包含任意数量的输入框,这些输入框映射到我在模型中的“某事物”类列表中,我现在用视图执行此操作

@using (Html.BeginForm())
{
    for (int i = 0; i < Model.Somethings.Count; i++)
    {
        Model.Index = i;
        @Html.Action("Index", "HtmlSection", Model);
    }
    // other stuff
}

和部分视图

@{
int index = Model.Index;
}
@Html.TextBoxFor(x => x.Somethings[index].TheProperty)

模型看起来像这样

public class HtmlSectionModel
{
    public List<Something> Somethings { get; set; }
    public int Index { get; set; }
}

最后,行动看起来像这样

public ActionResult Index(HtmlSectionModel model)
{
// do stuff
}

对我而言,这有效但不理想

  • 部分视图现在只能在此上下文中使用,它使用顶级模型而不仅仅是'Something'类
  • 我必须在模型中传递索引以获取绑定的唯一名称,如果我没有这样做,那么textbox将具有相同的名称/ id

在我看来,这是一种常见的模式,所以其他人必须以其他方式解决它?

我想我之后的内容是MVC等同于Asp.Net UserControls / Webcontrols(似乎是子动作/部分视图),但是,与模型绑定相结合似乎需要唯一的名称

2 个答案:

答案 0 :(得分:1)

我想要的东西可以用编辑器模板完成

控制器

   public class UsesEditorController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            return View(new SomeModel());
        }

        [HttpPost]
        public ActionResult Index(SomeModel model)
        {
            return View(model);
        }
    }

模型

public class Blob
{
    public string Name { get; set; }
    public string Address { get; set; }

    public Blob()
    {
        Name = string.Empty;
        Address = string.Empty;
    }
}

public class SomeModel
{
    public List<Blob> Blobs { get; set; }

    public SomeModel()
    {
        int count = 5;
        this.Blobs = new List<Blob>(count);

        for (int i = 0; i < count; i++)
        {
            this.Blobs.Add(new Blob());
        }
    }
}

查看

@model MyProject.Areas.EditorTemplates.Models.SomeModel

@using (Html.BeginForm())
{
    for (int i = 0; i < Model.Blobs.Count; i++)
    {       
        @Html.EditorFor(m => m.Blobs[i], "CustomEditorForBlob");
    }
    <input type="submit" value="Send data back" />
}

和编辑器,它可以在视图文件夹中的任何位置,因为我直接引用它

@model MyProject.Areas.EditorTemplates.Models.Blob

@Html.TextBoxFor(m => m.Name)

@Html.TextBoxFor(m => m.Address)

使用以下ID进行渲染:

<input class="k-textbox" id="Blobs_1__Name" name="Blobs[1].Name" ...

所以这给了我

  • 列表项
  • 重复结构,就像Asp.Net中的UserControls一样。
  • 编辑器模板仅引用Blob类,它不了解SomeModel类
  • 绑定工作(测试)

答案 1 :(得分:0)

在我看来,您想要完成的是输入的唯一ID,您当然不需要部分执行此操作。您可以在for循环中输出文本框,如下所示:

@ Html.TextBoxFor(x =&gt; x.Somethings [i] .TheProperty)

这将生成一个像id =“Somethings_1_TheProperty”的唯一ID。如果你不喜欢那个id,你当然可以用这样的东西制作自己的东西:

@Html.TextBoxFor(x => x.Somethings[i].TheProperty, new {id="id" + (i+1)})