C# 使用for循环渲染树视图
我正在上这门课:C# 使用for循环渲染树视图,c#,asp.net-mvc,for-loop,C#,Asp.net Mvc,For Loop,我正在上这门课: public class SortOrderModel { public string IdSort { get; set; } public List<ContentPage> ContentPages { get; set; } } public class ContentPage { public string Id { get; set; } public string ParentReference { get; set; } publi
public class SortOrderModel
{
public string IdSort { get; set; }
public List<ContentPage> ContentPages { get; set; }
}
public class ContentPage
{
public string Id { get; set; }
public string ParentReference { get; set; }
public string Title { get; set; }
public string SortOrder { get; set; }
}
假设我将SortOrderModel作为@model发送到一个视图
在视图中:Model.ContentPages是一个包含5个ContentPage的列表,其值为:
var home = new ContentPage()
{
Id = "ContentPages/1",
Title = "Home",
ParentReference = "/",
SortOrder = "0"
};
var about = new ContentPage()
{
Id = "ContentPages/2",
Title = "About",
ParentReference = "ContentPages/1",
SortOrder = "1"
};
var contactinfo = new ContentPage()
{
Id = "ContentPages/3",
Title = "ContactInfo",
ParentReference = "ContentPages/2",
SortOrder = "0"
};
var allProducts = new ContentPage()
{
Id = "ContentPages/4",
Title = "AllProducts",
ParentReference = "ContentPages/1",
SortOrder = "2"
};
var product1 = new ContentPage()
{
Id = "ContentPages/5",
Title = "Product1",
ParentReference = "ContentPages/4",
SortOrder = "0"
};
var product2 = new ContentPage()
{
Id = "ContentPages/6",
Title = "Product1",
ParentReference = "ContentPages/4",
SortOrder = "1"
};
如何使用for循环渲染具有这些值的树视图,使其看起来像这样:
> Home
> About
> ContactInfo
> AllProducts
> Product1
> Product2
@RenderItems("/");
使用for循环非常重要,因为我将在带有@Html.TextBoxFor的视图中使用它作为SortOrder属性,这样我就可以更改每个对象的SortOrder值。据我所知,我需要使用for循环而不是foreach来实现模型绑定,因为我要将值发送到[HttpPost]方法
这是我的尝试:
@model CMS_Affiliate_Web.Models.SortOrderModel
@{
string startPageId = "";
foreach (var pageId in Model.ContentPages.Where(o => o.Url == "/").Select(o => o.Id))
{
startPageId = pageId;
}
}
<ul>
<li>
<div>
@using (Html.BeginForm("SortOrderMenu", "secure", Model.ContentPages, FormMethod.Post))
{
@Html.HiddenFor(o => Model.IdSort)
var contentPages = Model.ContentPages.ToList();
for (int i = 0; i < contentPages.Count(); i++)
{
<ul>
@if (Model.ContentPages[i].Url == "/" || Model.ContentPages[i].ParentReference == startPageId)
{
<li>@Model.ContentPages[i].Title @Html.TextBoxFor(o => Model.ContentPages[i].SortOrder, new {@class = "sortBox"})</li>
}
else if (contentPages.Any(m => m.Id == contentPages[i].ParentReference))
{
<li style="padding-left: 80px; color: red;">@Model.ContentPages[i].Title @Html.TextBoxFor(o => Model.ContentPages[i].SortOrder, new {@class = "sortBox"})</li>
}
</ul>
}
<div class="activity-desk">
<input type="submit" value="Spara ny sortering" class="btn btn-primary" name="saveSliders" />
</div>
}
</div>
</li>
编辑
@model Models.sortordemodel
@{
ViewBag.Title=“SortOrderMenu”;
Layout=“~/Views/Shared/_Layout.cshtml”;
}
@帮助器RenderItems(字符串parentID,int indent=0)
{
@Html.HiddenFor(o=>Model.IdSort)
int index=ViewBag.ItemIndex±0;
foreach(Model.ContentPages中的var contentPage
.Where(p=>p.ParentReference==parentID)
.OrderBy(p=>p.SortOrder))
{
@Html.TextBoxFor(o=>Model.ContentPages[index].Id)
@内容页。标题
@Html.TextBoxFor(o=>Model.ContentPages[index].SortOrder,
新的{@class=“sortBox”})
ViewBag.ItemIndex=++索引;
@RenderItems(contentPage.Id,缩进+20)
;
index=ViewBag.ItemIndex;
}
}
@使用(Html.BeginForm(“SortOrderMenu”、“secure”、Model.ContentPages、FormMethod.Post))
{
@RenderItems(“ContentPages/6401”)
}
编辑2---------------
@helper RenderItems(字符串parentID,int indent=0)
{
@Html.HiddenFor(o=>Model.IdSort)
int index=ViewBag.ItemIndex±0;
foreach(Model.ContentPages中的var contentPage
.Where(p=>p.ParentReference==parentID)
.OrderBy(p=>p.SortOrder))
{
@Html.TextBoxFor(o=>Model.ContentPages[index].Id)
@内容页。标题
@Html.TextBoxFor(o=>Model.ContentPages[index].SortOrder,
新的{@class=“sortBox”})
ViewBag.ItemIndex=++索引;
@RenderItems(contentPage.Id,缩进+20);
index=ViewBag.ItemIndex;
}
}
@使用(Html.BeginForm(“SortOrderMenu”、“secure”、Model.ContentPages、FormMethod.Post))
{
@RenderItems(“/”)
}
控制器方法:
[HttpGet]
public ActionResult SortOrderMenu()
{
var allContentPages = RavenSession.Query<ContentPage>().ToList();
var sortOrderModel = new SortOrderModel();
sortOrderModel.ContentPages = allContentPages;
return View(sortOrderModel);
}
[HttpPost]
public ActionResult SortOrderMenu(SortOrderModel model)
{
foreach (var page in model.ContentPages)
{
var contPage = RavenSession.Load<ContentPage>(page.Id);
contPage.SortOrder = page.SortOrder;
RavenSession.SaveChanges();
}
return RedirectToAction("SortOrderMenu");
}
[HttpGet]
公共行动结果分类菜单()
{
var allContentPages=RavenSession.Query().ToList();
var sortOrderModel=新的sortOrderModel();
SortoreModel.ContentPages=所有ContentPages;
返回视图(sortordemodel);
}
[HttpPost]
公共行动结果SortOrderMenu(SortOrderModel模型)
{
foreach(model.ContentPages中的var页面)
{
var contPage=RavenSession.Load(page.Id);
contPage.SortOrder=page.SortOrder;
RavenSession.SaveChanges();
}
返回重定向操作(“SortOrderMenu”);
}
您将得到以下递归帮助程序:
@helper RenderItems(string parentID, int indent = 0)
{
foreach (var contentPage in Model.ContentPages
.Where(p => p.ParentReference == parentID)
.OrderBy(p => p.SortOrder))
{
var index = Model.ContentPages.IndexOf(contentPage);
<li style="padding-left: @(indent)px; color: red;">
@Html.TextBoxFor(o => Model.ContentPages[index].Id)
@contentPage.Title
@Html.TextBoxFor(o => Model.ContentPages[index].SortOrder,
new { @class = "sortBox" })
</li>
@RenderItems(contentPage.Id, indent + 20)
}
}
编辑:
或者,您可以使用Model.ContentPages.Index作为名称的隐藏输入来定义索引:
@helper RenderItems(string parentID, int indent = 0)
{
foreach (var contentPage in Model.ContentPages
.Where(p => p.ParentReference == parentID)
.OrderBy(p => p.SortOrder))
{
var index = Guid.NewGuid();
<input type="hidden" name="Model.ContentPages.Index" value="@(index)" />
<li style="padding-left: @(indent)px; color: red;">
@contentPage.Title
<input type="text" class="sortBox"
name="Model.ContentPages[@(index)].SortOrder"
value="@contentPage.SortOrder" />
</li>
@RenderItems(contentPage.Id, indent + 20)
}
}
@helper RenderItems(字符串parentID,int indent=0)
{
foreach(Model.ContentPages中的var contentPage
.Where(p=>p.ParentReference==parentID)
.OrderBy(p=>p.SortOrder))
{
var index=Guid.NewGuid();
@内容页。标题
@RenderItems(contentPage.Id,缩进+20)
}
}
请先列出您的尝试示例。现在,我已经添加了一个我尝试的示例,@cubble.jockey谢谢!棒极了!它呈现出完美的效果但是我如何才能在html.beginform中使用它来将其发布到[httpPost]方法中呢。因为我的目标是能够再次更新SortOrder值hanks!但我发现了一些不匹配的东西。文本框中写入的排序器值与其数据不匹配。我如何解决这个问题?我在html.beginform中尝试过,但是传递给[httppost]-metod的值不正确。从我创建的示例代码的inctances中,它只向[httppost]方法发布一个包含parentreference“contentpages/1”的contentpages列表。请帮帮我(哦,我明白了。只是改变了IndexOf方法计算项目索引的逻辑。请注意,第二种(可选)方法也应该有效;并删除了ViewBag.ItemIndex中的所有内容。
@helper RenderItems(string parentID, int indent = 0)
{
foreach (var contentPage in Model.ContentPages
.Where(p => p.ParentReference == parentID)
.OrderBy(p => p.SortOrder))
{
var index = Model.ContentPages.IndexOf(contentPage);
<li style="padding-left: @(indent)px; color: red;">
@Html.TextBoxFor(o => Model.ContentPages[index].Id)
@contentPage.Title
@Html.TextBoxFor(o => Model.ContentPages[index].SortOrder,
new { @class = "sortBox" })
</li>
@RenderItems(contentPage.Id, indent + 20)
}
}
@RenderItems("/");
@helper RenderItems(string parentID, int indent = 0)
{
foreach (var contentPage in Model.ContentPages
.Where(p => p.ParentReference == parentID)
.OrderBy(p => p.SortOrder))
{
var index = Guid.NewGuid();
<input type="hidden" name="Model.ContentPages.Index" value="@(index)" />
<li style="padding-left: @(indent)px; color: red;">
@contentPage.Title
<input type="text" class="sortBox"
name="Model.ContentPages[@(index)].SortOrder"
value="@contentPage.SortOrder" />
</li>
@RenderItems(contentPage.Id, indent + 20)
}
}