【问题标题】:Updating a Partial View in MVC 5在 MVC 5 中更新局部视图
【发布时间】:2017-06-13 14:39:06
【问题描述】:

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

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

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

Updating PartialView mvc 4

但我对所说的内容有一些疑问。

有人说:“有一些方法可以做到这一点。例如,您可以使用 jQuery:”,然后他显示了 Java 查询。

但他也展示了另一种方法并说:“如果你在动作中使用逻辑 UpdatePoints() 来更新点”

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

我收到以下错误

参数字典包含“System.Controllers.RController”中方法“System.Web.Mvc.ActionResult UpdateList(Int32)”的不可空类型“System.Int32”的参数“ID”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

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

所以在创建视图中:

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

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

    //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;我不明白的部分。有人知道那里发生了什么吗?

【问题讨论】:

    标签: javascript asp.net-mvc asp.net-mvc-4 asp.net-mvc-3 razor


    【解决方案1】:

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

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

    这个错误意味着模型绑定器找不到动作方法的参数“ID”

    public ActionResult UpdateList(int ID)
    

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

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

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

    public ActionResult UpdateList(int ID=value)
    

    或使“ID”可以为空:

    public ActionResult UpdateList(int? ID)
    

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

    这是你控制器中的“动作名称”

    还有谁知道这意味着什么 ViewBag.points = _Repository.Points;

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

    【讨论】:

    • 您好,感谢您的帮助。我试图在选择下拉列表时更新创建视图上的部分视图。因此,如果您在用户单击下拉列表中的值时想到 Web 表单,您可以根据该选择使用一些值更新列表控件。我希望 mvc 应用程序也能做同样的事情。另一个线程上的答案非常令人困惑,因为它没有显示如果列表为空或更新会发生什么。所以我可能会融入做同样事情的方式。此外,如果 id 需要来自下拉列表,它将如何被引用?
    • 好的,感谢 viewbag 信息,所以这个用户必须有一些更复杂的事情,关于他如何获得 viewbag 数据,以使其部分视图与点 (.) 一起工作......你知道吗更新部分视图的简单方法?我目前正在阅读这个simple-talk.com/dotnet/asp-net/…,但它太技术性了......我很难理解它。
    • OK。编辑您的问题并显示您的“创建视图”的完整代码以及您的“下拉列表”在哪里,并显示您的部分视图“UpdatePoints”和“UpdateList”。我会尽力帮忙的。
    • 嗨@Konstantine Zikevich...我的下拉菜单不是问题...不过是部分视图谢谢!
    【解决方案2】:

    因此,在 Matt Bodily 的帮助下,您可以使用视图在由下拉列表中的更改值触发的创建视图中填充部分视图

    bag 和一个叫做 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();
        }
    

    在您的 Create 控制器中,使用 [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();
                        }
                    });
    

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

    另一个人必须经历我必须经历的多天恐怖表演才能获得最初基于我认为的错误的东西

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

    解决方案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      相关资源
      最近更新 更多