Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用for循环渲染树视图_C#_Asp.net Mvc_For Loop - Fatal编程技术网

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)
        }
    }