Asp.net mvc 创建重复HTML节的更好方法

Asp.net mvc 创建重复HTML节的更好方法,asp.net-mvc,Asp.net Mvc,我以前问过一次这个问题,但没有任何代码可以看,这里我有一个实现,我想知道是否有更好的方法来完成这一点 我想要一个重复的html部分,如下所示: <div> <input id=id1 name=id1 type=text/> </div> <div> <input id=id2 name=id2 type=text/> </div etc 模型是这样的 public class HtmlSectionModel {

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

我想要一个重复的html部分,如下所示:

<div>
  <input id=id1 name=id1 type=text/>
</div>
<div>
  <input id=id2 name=id2 type=text/>
</div
etc
模型是这样的

public class HtmlSectionModel
{
    public List<Something> Somethings { get; set; }
    public int Index { get; set; }
}
public ActionResult Index(HtmlSectionModel model)
{
// do stuff
}
对我来说,这是可行的,但并不理想

  • 局部视图现在只能在此上下文中使用,它使用顶级模型,而不仅仅是“Something”类
  • 为了获得绑定的唯一名称,我必须在模型中传递一个索引,如果我没有这样做,那么textbox将具有相同的名称/id
在我看来,这似乎是一种常见的模式,所以其他人一定用其他方式解决了它


我想我在这里想要的是与Asp.Net UserControls/Webcontrols(似乎是子操作/局部视图)等效的MVC,但是,结合似乎需要唯一名称的模型绑定,在我看来,您试图实现的是输入的唯一ID,您当然不需要局部ID来实现这一点。您可以在for循环中输出文本框,如下所示:

@Html.TextBoxFor(x=>x.Somethings[i].TheProperty)

这将生成一个唯一的id,如id=“Somethings\u 1\u TheProperty”。如果您不喜欢该id,您当然可以使用以下内容制作自己的id:

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

我想要的可以通过编辑器模板实现

控制器

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

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

这将使用如下ID进行渲染:

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

假设有3个输入和一个范围,我想在其他页面上重复此模式,并将其包含在for循环中
   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)
<input class="k-textbox" id="Blobs_1__Name" name="Blobs[1].Name" ...