在 MVC 5 中更新局部视图

Updating a Partial View in MVC 5

我在尝试加载应在 MVC 应用程序的创建视图中显示列表的局部视图时遇到错误。该列表基于一个值,将来自一个值列表的下拉控件。

在创建视图时没有选择,因此列表为空,并且需要在用户在 MVC 创建视图中选择值后刷新。

我遵循了这个问题的公认答案并得到了错误:

Updating PartialView mvc 4

但是我对所讲的内容有些疑问。

有人说:"There are some ways to do it. For example you may use jQuery:" 他显示了 Java 查询。

但他还展示了另一种方法并说:"If you use logic in your action UpdatePoints() to update points"

[HttpPost]
public ActionResult UpdatePoints()
{    
   ViewBag.points =  _Repository.Points;
   return PartialView("UpdatePoints");
 }

我收到以下错误

The parameters dictionary contains a null entry for parameter 'ID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult UpdateList(Int32)' in 'System.Controllers.RController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

我不知道这个错误是什么意思

所以在创建视图中:

        <div class="col-sm-6">

            <div class="form-horizontal" style="display:none" id="PVList">

                @{ Html.RenderAction("UpdateList");}

            </div>
        </div>

在controller下create action作为自己的函数

    [HttpGet]
    public ActionResult UpdateList(int ID)
    {

        if (ID != 0)
        {
            ViewBag.List = Get_List(ID);
            return PartialView("PV_List");

        }
        else
        {
            ViewBag.List = "";
            return PartialView("");
        }


    }

以及为查看包函数制作列表的函数:

private List<SQL_VIEW_LIST> Get_List(int ID)
        {

            return db.SQL_VIEW_LIST.Where(i => i.ID == ID).ToList();
        }

值列表下拉值列表的Java脚本:它还控制在列表有数据时打开列表的可见性:

    //Fire The List to make visible after list values select 
    $(document).ready(function () {
        $('#RES_VEH_ID').change(function ()
        {

            $("#PV_List").show(); // Shows Edit Message
            $.post('@Url.Action("PostActionTo_Partial","Create")').always(function()
                   { ('.target').load('/Create'); })

        });
    })

还有谁知道这个字符串是什么意思:? "PostActionTo_Partial"

还有谁知道这是什么意思ViewBag.points = _Repository.Points;我得到了视图包部分,但它是 _Repository.Points;我不明白的部分。有人知道那里发生了什么吗?

我不明白你想做什么。但我会尽力回答。

I have no clue what this error means.

此错误意味着模型绑定器找不到操作方法

的参数 "ID"
public ActionResult UpdateList(int ID)

因为您没有为此方法发送任何参数: 你可以试试这个:

@{ Html.RenderAction("UpdateList", new {ID="value"});}

或者您可以在您的方法中设置默认值:

public ActionResult UpdateList(int ID=value)

或使 "ID" 可为空:

public ActionResult UpdateList(int? ID)

Also does anyone know what this string mean: ? "PostActionTo_Partial"

这是 "action name" 在你的控制器

Also does anyone know what this means ViewBag.points = _Repository.Points;

这意味着分配动态对象“VivBag.points”数据以将它们传输到视图中

因此,在 Matt Bodily 的帮助下,您可以使用视图

在由下拉列表中的更改值触发的创建视图中填充部分视图

包和一个叫做 Ajax 的东西。以下是我如何使我的代码工作。

首先是您需要检查空数据的部分视图代码示例

_WidgetListPartial

 @if (@ViewBag.AList != null)
    {
    <table cellpadding="1" border="1">
    <tr>
        <th>
            Widget Name 
        </th>
     </tr>

@foreach (MvcProgramX.Models.LIST_FULL item in @ViewBag.AList)
   {
    <tr>
        <td>
            @item.WidgetName
        </td>        
    </tr>
   }

   </table>
  }

使用函数在控制器中填充 View Bag

    private List<DB_LIST_FULL> Get_List(int? VID)
    {

        return db.DB_LIST_FULL.Where(i => i.A_ID == VID).ToList();
    }

在您的创建控制器中使用 [HttpGet] 元素添加这样的结构 这会将您的数据和您的部分视图发送到您在创建屏幕上的屏幕占位符 VID 将是您的 Drop

中的 ID

向下列表此功能还将部分视图发送回创建表单屏幕

    [HttpGet]
    public ActionResult UpdatePartialViewList(int? VID)
    {           

        ViewBag.AList = Get_List(VID);
        return PartialView("_WidgetListPartial",ViewBag.AList);


    }

如果需要,我不是 100%,但我将以下内容添加到 ActionResult 创建表单 ID 和 FormCollection,这样我就可以

从下拉列表中读取值。同样,Ajax 的东西可能会小心,但以防万一,应用程序似乎正在使用

它。

这是在 [HttpPost]

   public ActionResult Create(int RES_VID, FormCollection Collection, [Bind(Include = "... other form fields

这又在 [HttpGet] 中,可能也不需要。这是从表单中读取一个值

 UpdatePartialViewList(int.Parse(Collection["RES_VID"]));

在您希望显示局部视图的创建视图屏幕上

        <div class="col-sm-6">

            <div class="form-horizontal" style="display:none" id="PV_WidgetList">

                @{ Html.RenderAction("UpdatePartialViewList");}



            </div>
        </div>

最后是 Ajax 代码,它从下拉列表中读取点击。获取所选项目的值并将值传递回

构建列表并发送它以更新局部视图的所有控制器代码,如果那里有数据,它会传递局部视图

使用更新列表创建表单。

    $(document).ready(function () {
        $('#RES_VID').change(function ()
        {

            debugger;

            $.ajax(

                {
                    url: '@Url.Action("UpdatePartialViewList")',
                    type: 'GET',
                    data: { VID: $('#RES_VID').val() },

                    success: function (partialView)
                    {
                        $('#PV_WidgetList').html(partialView);
                        $('#PV_WidgetList').show();
                    }
                });

这很多不是最好的方法,但这是一个完整的经过测试的答案,因为它有效,并且它是过程的每一步,希望没有

其他人必须经历 multi-day 恐怖表演我必须经历才能根据我认为的错误得到最初有效的东西

这无法在 mvc 中完成,我将不得不在 webforms 中继续该应用程序。再次感谢所有帮助我制定此计划的人

解决!