C# 模型传递到局部视图

C# 模型传递到局部视图,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我一直在四处寻找,但找不到一个直接的解决方案来实现我的目标 我已经试着包含了所需的内容,但这是一个非常大的项目,所以希望你能得到要点 概述: 我有一个视图模型,其中包含多个对象列表。我使用两个局部视图来控制每个对象列表,一个用于收集对象列表(在会话中保存),另一个用于将所述对象的列表添加到列表中 更新: 根据评论-我希望做的如下-在索引中,填写现有的IP模型信息,通过addToListPartialView显示,然后它将发布到ListPartialView,通过会话更新列表,在控制器中处理后端,

我一直在四处寻找,但找不到一个直接的解决方案来实现我的目标

我已经试着包含了所需的内容,但这是一个非常大的项目,所以希望你能得到要点

概述: 我有一个视图模型,其中包含多个对象列表。我使用两个局部视图来控制每个对象列表,一个用于收集对象列表(在会话中保存),另一个用于将所述对象的列表添加到列表中

更新: 根据评论-我希望做的如下-在索引中,填写现有的IP模型信息,通过addToListPartialView显示,然后它将发布到ListPartialView,通过会话更新列表,在控制器中处理后端,然后在索引上显示-问题最终是,我如何做到这一点

问题: 我遇到的问题是,一旦我通过一个局部视图将一个对象添加到对象列表中,另一个局部视图,我如何将其传递回主视图

代码:

@model ViewModel
<div id="ExistingIpList">
                    @{Html.RenderPartial("ExistingIpView");}
                </div>
                <div id="addExisting">
                    @{Html.RenderPartial("AddExistingIp");}
                </div>
@using (Html.BeginForm("AddExistingIp", "PA_IPV4"))
{
    <div class="ui-grid-c ui-responsive">
        <div class="ui-block-a">
            <span>
                @Html.EditorFor(m => m.Subnet)
                @Html.ValidationMessageFor(m => m.Subnet)
            </span>
        </div>
        <div class="ui-block-b">
            <span>
                @Html.EditorFor(m => m.Cidr)
                @Html.ValidationMessageFor(m => m.Cidr)
            </span>
        </div>
        <div class="ui-block-c">
            <span>
                @Html.EditorFor(m => m.Mask)
                @Html.ValidationMessageFor(m => m.Mask)
            </span>
        </div>
        <div class="ui-block-d">
            <span>
                @Html.EditorFor(m => m.Id)
                @Html.ValidationMessageFor(m => m.Id)
            </span>
        </div>
    </div>
    <div data-role="main" class="ui-content">
        <div data-role="controlgroup" data-type="horizontal">
            <input type="submit" id="addExistingIp" cssclass="ui-btn ui-corner-all ui-shadow" value="Add" />
        </div>
    </div>
}
public Contact ContactDetails { get; set; }
[Required]
public bool ExistingAddress { get; set; }
public List<ExistingIp> ExistingIps { get; set; }
[Required]
[DataType(DataType.MultilineText)]
public string ExistingNotes { get; set; }
控制器

public ActionResult AddExistingIp([Bind(Include = "Subnet, Cidr, Mask")]ExistingIp existingIp)
        {
            if(Session["pa_ipv4Session"] != null)
            {
                pa_ipv4 pa_ipv4 = (pa_ipv4)Session["pa_ipv4Session"];
                if(pa_ipv4.ExistingIps == null)
                {
                    pa_ipv4.ExistingIps = new List<ExistingIp>();
                }
                pa_ipv4.ExistingIps.Add(existingIp);
                ViewBag.pa_ipv4 = pa_ipv4.ExistingIps;

                return View("ExistingIpView", ViewBag.pa_ipv4);
            }
            else
            {
                pa_ipv4 pa_ipv4 = new pa_ipv4();
                Session["pa_ipv4Session"] = pa_ipv4;
                pa_ipv4.ExistingIps = new List<ExistingIp>();
                pa_ipv4.ExistingIps.Add(existingIp);
                ViewBag.pa_ipv4 = pa_ipv4.ExistingIps;

                return View("ExistingIpView", ViewBag.pa_ipv4);
            }
public ActionResult AddExistingIp([Bind(Include=“Subnet,Cidr,Mask”)]ExistingIp ExistingIp)
{
如果(会话[“pa_ipv4Session”]!=null)
{
pa_ipv4 pa_ipv4=(pa_ipv4)会话[“pa_ipv4会话”];
if(pa_ipv4.ExistingIps==null)
{
pa_ipv4.ExistingIps=新列表();
}
pa_ipv4.ExistingIps.Add(existingIp);
ViewBag.pa_ipv4=pa_ipv4.ExistingIps;
返回视图(“ExistingIpView”,ViewBag.pa_ipv4);
}
其他的
{
pa_ipv4 pa_ipv4=新的pa_ipv4();
会话[“pa_ipv4会话”]=pa_ipv4;
pa_ipv4.ExistingIps=新列表();
pa_ipv4.ExistingIps.Add(existingIp);
ViewBag.pa_ipv4=pa_ipv4.ExistingIps;
返回视图(“ExistingIpView”,ViewBag.pa_ipv4);
}
索引:

@model ViewModel
<div id="ExistingIpList">
                    @{Html.RenderPartial("ExistingIpView");}
                </div>
                <div id="addExisting">
                    @{Html.RenderPartial("AddExistingIp");}
                </div>
@using (Html.BeginForm("AddExistingIp", "PA_IPV4"))
{
    <div class="ui-grid-c ui-responsive">
        <div class="ui-block-a">
            <span>
                @Html.EditorFor(m => m.Subnet)
                @Html.ValidationMessageFor(m => m.Subnet)
            </span>
        </div>
        <div class="ui-block-b">
            <span>
                @Html.EditorFor(m => m.Cidr)
                @Html.ValidationMessageFor(m => m.Cidr)
            </span>
        </div>
        <div class="ui-block-c">
            <span>
                @Html.EditorFor(m => m.Mask)
                @Html.ValidationMessageFor(m => m.Mask)
            </span>
        </div>
        <div class="ui-block-d">
            <span>
                @Html.EditorFor(m => m.Id)
                @Html.ValidationMessageFor(m => m.Id)
            </span>
        </div>
    </div>
    <div data-role="main" class="ui-content">
        <div data-role="controlgroup" data-type="horizontal">
            <input type="submit" id="addExistingIp" cssclass="ui-btn ui-corner-all ui-shadow" value="Add" />
        </div>
    </div>
}
public Contact ContactDetails { get; set; }
[Required]
public bool ExistingAddress { get; set; }
public List<ExistingIp> ExistingIps { get; set; }
[Required]
[DataType(DataType.MultilineText)]
public string ExistingNotes { get; set; }
@model视图模型
@{Html.RenderPartial(“ExistingIpView”);}
@{Html.RenderPartial(“AddExistingIp”);}
列出部分内容

@model IEnumerable<ExistingIp>

@if (Model != null)
{
    foreach (var ei in Model)
    {
        <div class="ui-grid-c ui-responsive">
            <div class="ui-block-a">
                <span>@ei.Subnet</span>
            </div>
            <div class="ui-block-b">
                <span>@ei.Cidr</span>
            </div>
            <div class="ui-block-c">
                <span>@ei.Mask</span>
            </div>
            <div class="ui-block-d">
                @ei.Id
                <a href="#" class="deleteExistingIp" cssclass="ui-btn ui-corner-all ui-shadow">Delete</a>
            </div>
        </div>
    }
}
@model IEnumerable
@如果(型号!=null)
{
foreach(模型中的var ei)
{
@子网
@苹果酒
@ei.面具
@ei.Id
}
}
添加到部分列表:

@model ViewModel
<div id="ExistingIpList">
                    @{Html.RenderPartial("ExistingIpView");}
                </div>
                <div id="addExisting">
                    @{Html.RenderPartial("AddExistingIp");}
                </div>
@using (Html.BeginForm("AddExistingIp", "PA_IPV4"))
{
    <div class="ui-grid-c ui-responsive">
        <div class="ui-block-a">
            <span>
                @Html.EditorFor(m => m.Subnet)
                @Html.ValidationMessageFor(m => m.Subnet)
            </span>
        </div>
        <div class="ui-block-b">
            <span>
                @Html.EditorFor(m => m.Cidr)
                @Html.ValidationMessageFor(m => m.Cidr)
            </span>
        </div>
        <div class="ui-block-c">
            <span>
                @Html.EditorFor(m => m.Mask)
                @Html.ValidationMessageFor(m => m.Mask)
            </span>
        </div>
        <div class="ui-block-d">
            <span>
                @Html.EditorFor(m => m.Id)
                @Html.ValidationMessageFor(m => m.Id)
            </span>
        </div>
    </div>
    <div data-role="main" class="ui-content">
        <div data-role="controlgroup" data-type="horizontal">
            <input type="submit" id="addExistingIp" cssclass="ui-btn ui-corner-all ui-shadow" value="Add" />
        </div>
    </div>
}
public Contact ContactDetails { get; set; }
[Required]
public bool ExistingAddress { get; set; }
public List<ExistingIp> ExistingIps { get; set; }
[Required]
[DataType(DataType.MultilineText)]
public string ExistingNotes { get; set; }
@使用(Html.BeginForm(“AddExistingIp”,“PA_IPV4”))
{
@EditorFor(m=>m.Subnet)
@Html.ValidationMessageFor(m=>m.Subnet)
@EditorFor(m=>m.Cidr)
@Html.ValidationMessageFor(m=>m.Cidr)
@EditorFor(m=>m.Mask)
@Html.ValidationMessageFor(m=>m.Mask)
@EditorFor(m=>m.Id)
@Html.ValidationMessageFor(m=>m.Id)
}
视图模型:

@model ViewModel
<div id="ExistingIpList">
                    @{Html.RenderPartial("ExistingIpView");}
                </div>
                <div id="addExisting">
                    @{Html.RenderPartial("AddExistingIp");}
                </div>
@using (Html.BeginForm("AddExistingIp", "PA_IPV4"))
{
    <div class="ui-grid-c ui-responsive">
        <div class="ui-block-a">
            <span>
                @Html.EditorFor(m => m.Subnet)
                @Html.ValidationMessageFor(m => m.Subnet)
            </span>
        </div>
        <div class="ui-block-b">
            <span>
                @Html.EditorFor(m => m.Cidr)
                @Html.ValidationMessageFor(m => m.Cidr)
            </span>
        </div>
        <div class="ui-block-c">
            <span>
                @Html.EditorFor(m => m.Mask)
                @Html.ValidationMessageFor(m => m.Mask)
            </span>
        </div>
        <div class="ui-block-d">
            <span>
                @Html.EditorFor(m => m.Id)
                @Html.ValidationMessageFor(m => m.Id)
            </span>
        </div>
    </div>
    <div data-role="main" class="ui-content">
        <div data-role="controlgroup" data-type="horizontal">
            <input type="submit" id="addExistingIp" cssclass="ui-btn ui-corner-all ui-shadow" value="Add" />
        </div>
    </div>
}
public Contact ContactDetails { get; set; }
[Required]
public bool ExistingAddress { get; set; }
public List<ExistingIp> ExistingIps { get; set; }
[Required]
[DataType(DataType.MultilineText)]
public string ExistingNotes { get; set; }
公共联系人联系人详细信息{get;set;}
[必需]
公共bool现有地址{get;set;}
现有公共列表IPS{get;set;}
[必需]
[数据类型(DataType.multilitext)]
现有公共字符串notes{get;set;}

您可以修改
AddExistingIp
以仅存储数据。并进行
重定向到操作
索引
。在那里,您将从
会话
获取数据并将其传递给模型

[HttpPost]
public ActionResult AddExistingIp([Bind(Include = "Subnet, Cidr, Mask")]ExistingIp existingIp)
{
    if(Session["pa_ipv4Session"] != null)
    {
        pa_ipv4 pa_ipv4 = (pa_ipv4)Session["pa_ipv4Session"];
        if(pa_ipv4.ExistingIps == null)
        {
            pa_ipv4.ExistingIps = new List<ExistingIp>();
        }
        pa_ipv4.ExistingIps.Add(existingIp);
    }
    else
    {
        pa_ipv4 pa_ipv4 = new pa_ipv4();
        Session["pa_ipv4Session"] = pa_ipv4;
        pa_ipv4.ExistingIps = new List<ExistingIp>();
        pa_ipv4.ExistingIps.Add(existingIp);
    }

    return RedirectToAction("Index");
}
另外,我认为您的
索引
视图您应该在
ExistingIpView
中传递
模型
以显示

@model ViewModel
<div id="ExistingIpList">
    @{Html.RenderPartial("ExistingIpView", Model.ExistingIps);}
</div>
<div id="addExisting">
    @{Html.RenderPartial("AddExistingIp");}
</div>
@model视图模型
@{Html.RenderPartial(“ExistingIpView”,Model.ExistingIps);}
@{Html.RenderPartial(“AddExistingIp”);}

不完全确定您的要求是什么,但是如果一个部分包含一个表单来添加一个新项,那么当您发布时,您需要重定向回GET方法,以便重新构建视图。但是使用ajax发布表单,然后用新项更新DOM会有更好的性能抱歉,我将更新问题并尝试更清楚一点-基本上我希望能够做的是在索引中,填写通过addPartialView显示的现有IP模型信息,然后它将发布到ListPartialView以通过会话更新列表,该会话将依次显示在索引上。这意味着当您发布到
AddExistingIp
并保存项目时,您需要重定向到
Index()方法,而不是返回视图。但是使用ajax会有更好的性能,并且您可以摆脱对会话的糟糕使用。您的意思是完全删除会话吗?我在提交之前没有数据库,它允许模型(很多)阅读和写作。有那么糟糕还是个人不喜欢?@JammAndTea他指的是我在回答中所做的事情。你必须
重定向到操作(“索引”)
然后从
会话
中获取列表,并将其提供给
索引
视图。您的编辑应该可以解决这个问题,需要在页面加载上创建所有内容的新实例,干杯。@JammAndTea我不理解您的意思,您能给我更多详细信息吗?我认为上面的内容不正确,在ren中为空引用derpartial existingIpView,model.existingIps由于在启动时未创建,因此您无法遍历不存在的列表。是否可以通过控制器执行此操作