MVC - Html.Action使用Javascript获取元素,然后将其作为参数传递给控制器​​,然后返回PartialView

问题描述:

查看 - 我的视图有一个@Html.Action的模式,它调用Controller中的PartialViewResult。注意@Html.Action("RetrieveItemPrice", new { item_Id = 1 })仍然有预定义的item_IdMVC - Html.Action使用Javascript获取元素,然后将其作为参数传递给控制器​​,然后返回PartialView

问题1:如何在将参数发送到Controller之前创建一个函数来获取元素的值并将其放入item_Id参数中?这可以插入@Html.Action

<div id="myModal" class="modal fade" role="dialog"> 
    <div class="modal-dialog"> 
     <!-- Modal content--> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal">&times;</button> 
       <h4 class="modal-title">Modal Header</h4> 
      </div> 
      <div class="modal-body"> 
       <div id="pvPrice" class="" style="border: 0px solid green; "> 
        @Html.Action("RetrieveItemPrice", new { item_Id = 1 }) 
       </div> 
      </div> 
      <div class="modal-footer"> 
       <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
      </div> 
     </div> 
    </div> 
</div> 

<table id="dbTable"> 
    <thead> 
     <tr> 
      <th class="hidden"> 
       @Html.DisplayNameFor(model => model.itemId) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.itemName) 
      </th> 
     </tr> 
    </thead> 
    <tbody id="dbBody"> 
     @foreach (var item in Model.Items) 
     { 
      <tr> 
       <td class="hidden"> 
        @Html.DisplayFor(modelItem => item.itemid) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.itemname) 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 

控制器

public PartialViewResult RetrieveItemPrice(string item_Id) 
{ 
    var prices = from ip in _odb.ITEM_PRICE_MSTR 
       join i in _odb.ITEM_MSTR on i.ITM_ID equals i.ITM_ID 
       select new ItemModel 
       { 
        itemid = i.ITM_ID, 
        itemname = i.ITM_DESC, 
        itemprice = ip.ITM_PRICE, 
        defaultflag = ip.DEFAULT_FL, 
        startdate = DbFunctions.TruncateTime(ip.START_DT), 
        enddate = DbFunctions.TruncateTime(ip.END_DT), 
        createddt = i.CREA_DT 
       }; 

    prices = prices.Where(i => i.itemid.ToLower().Contains(item_Id.ToLower())); 
    prices = prices.OrderByDescending(i => i.itemprice); 

    var vm = new ItemViewModel(); 
    vm.Items = prices.ToPagedList(pageNumber, pageSize); 

    return PartialView("_ViewItemPrice", vm); 
} 

,Q#2:当我回用PartialViewResult一个在ControllerPartialView,谁去接受,并在View显示呢?我运行了代码,但没有显示任何内容。我想我仍然缺少View中的代码来接收返回的PartialViewController

+0

** l获取元素的值**哪个元素?您在问题 – Shyju

+0

中未显示您在主视图中建模的Dos包含'item_Id'的值的属性? –

+1

并注意'@ Html.Action()'是服务器端代码,并在主视图发送到浏览器之前在控制器中执行。创建一个将获得元素值并将其放入item_Id parameter_中的_function没有意义。如果你想让'item_Id'的值基于用户编辑的东西,那么你需要使用ajax来调用一个服务器方法来返回你的局部视图。 –

假设您有许多具有不同item_Id的项目,并且想要在单击该项目时显示模式对话框。您应该听取元素上的click事件,进行ajax调用并获取响应(部分视图结果)并使用它来构建模态对话框内容。

假设你的主要观点有这样

<table> 
@foreach (var item in Model.Items) 
{ 
    <tr> 
     <td>@item.itemname</td> 
     <td><a href="@Url.Action("RetrieveItemPrice",new { item_Id = itemId})" 
                 class="modal-link" >@item.itemname</a> 
     </td> 
    </tr> 
} 
</table> 
<!-- The below code is for the modal dialog --> 
<div id="modal-container" class="modal fade" tabindex="-1" role="dialog"> 
    <a href="#close" title="Close" class="modal-close-btn">X</a> 
    <div class="modal-content"> 
     <div class="modal-body"></div> 
</div> 

这将生成CSS类模式,链接表中的每个条目链接的代码。链接的href值将如YourControllerName/RetrieveItemPrice?item_id=123123将被替换为实际的itemid)现在监听这些click事件,对这些链接的href属性值进行ajax调用并使用响应来填充模式对话内容。

$(function() { 

    $('body').on('click', '.modal-link', function (e) { 
     e.preventDefault(); 

     $("#modal-container").remove(); 
     $.get($(this).attr("href"), function (data) { 
       $('<div id="modal-container" class="modal fade"> 
         <div class="modal-content" id="modalbody">' 
               + data + '</div></div>').modal(); 
     }); 
    }); 
}); 

该代码将取代模式与来自RetrieveItemPrice动作方法来局部视图结果的全部内容。这意味着you need to include the necessary markup needed for the modal header and footer(带按钮)在_ViewItemPrice部分视图中。

A#1:调用@Html.Action的代码是在服务器端执行的,在那个阶段,html文档没有发送到客户端,因此您不必查找检索元素值的方法。您可以直接将其传递给调用,因为用于渲染视图的模型(包括元素)应该可以通过模态中的代码访问。

如果您将模态标记放在视图中,您肯定可以获得@ Model.ItemId。 如果您在局部视图的模式,您可以通过ViewBag通过项目ID:

@Html.Partial("Modal", null, new ViewDataDictionary{{"ItemId", Model.ItemId}}) 

然后在模态标记使用它:

@Html.Action("RetrieveItemPrice", new { item_Id = ViewBag.ItemId }) 

A#2:你应该尝试,如果[ChildActionOnly]使行动RetrieveItemPrice的作品。