2017-04-20 75 views
1

我在我的MVC5视图上实现了kendo组合框,并希望基于模型中的值过滤组合框。我需要从我的模型中检索值。我目前已将该值绑定到名为CountryCode的隐藏字段中。该剧本是我的主要观点。我在尝试访问隐藏字段时收到未定义的错误消息。该模型肯定会使用CountryCode填充。无法从主视图检索局部视图中的隐藏元素

@using System.Collections 
@model CC.GRP.MCRequest.ViewModels.RequestStatusUpdateViewModel 

@{ 
    Layout = null; 
} 

<div class="k-popup-edit-form k-window-content k-content" > 
     <div class="k-edit-form-container"> 
    @Html.HiddenFor(model => model.CountryCode) 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.RequestID) 
      </div> 
      <div class="editor-field"> 
       @Html.EditorFor(model => model.RequestID, new { htmlAttributes = new { @readonly = "readonly" } }) 
      </div> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.ProjectName) 
      </div> 
      <div class="editor-field"> 
       @Html.EditorFor(model => model.ProjectName, new { htmlAttributes = new { @readonly = "readonly" } }) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(model => model.RequestStatus) 
       </div> 
       <div class="editor-field"> 
        @(Html.Kendo().ComboBoxFor(model => model.RequestStatusCode) 

        .HtmlAttributes(new { style = "width:100%" }) 
        .DataTextField("Status") 
        .Placeholder("Select...") 
        .DataValueField("RequestStatusCode") 
        .AutoBind(false) 
        .Filter("contains") 

        .DataSource(dataSource => dataSource 

        .Read(read => 
        { 
         read.Action("GetRequestStatus", "Request") 
          .Type(HttpVerbs.Post) 
          .Data("GetCountryCodeFilter"); 
        }).ServerFiltering(true) 


         ) 
        ) 
       </div> 
       @Html.ValidationMessageFor(model => model.RequestStatusCode, "", new { @class = "text-danger" }) 

      </div> 

    </div> 

控制器方法,其填充组合

public ActionResult GetRequestStatus(string countryCode) 
     { 
      var response = requestRepository.GetRequestStatus(countryCode).AsQueryable().ProjectTo<RequestStatusViewModel>(); 

      var jsonResult = Json(response, JsonRequestBehavior.AllowGet); 
      jsonResult.MaxJsonLength = int.MaxValue; 
      return jsonResult; 
     } 

加载视图控制器方法

public ActionResult RequestStatus(int requestId, string projectName, string countryCode) 
    { 
     RequestStatusUpdateViewModel reqeustStatusUpdateViewModel = new RequestStatusUpdateViewModel(); 

     reqeustStatusUpdateViewModel.RequestID = requestId; 
     reqeustStatusUpdateViewModel.ProjectName = projectName; 
     reqeustStatusUpdateViewModel.CountryCode = countryCode; 

     if (!ModelState.IsValid) 
     { 
      // return View("NewRequestView", Mapper.Map<RequestStatusViewModel>(newReqeustViewModel)); 
      return null; 
     } 
     return View("_RequestStatusView", Mapper.Map<RequestStatusUpdateViewModel>(reqeustStatusUpdateViewModel)); 
    } 

RequestStatusViewModel

public class RequestStatusViewModel 
     { 
      public string RequestStatusCode { get; set; } 
      public string Status { get; set; } 
      public int DisplaySequenceNo { get; set; } 
     } 

脚本在主视图

function GetCountryCodeFilter() { 
     alert("Hello"); 
     alert($('#CountryCode').val()); 

     return { countryCode: $('#CountryCode').val() } 
    }; 

回答

1

我假设这是从剑道格的弹出。问题在于视图被序列化并在任何行被点击时发送到弹出窗口。它并不像您期望的MVC那样绑定数据 - 它每次都会发送相同的序列化数据。请参阅here

所以改变你的隐藏使用kendo的MVVM绑定,以便每个实例从网格行获取值。 (COUNTRYCODE需要存在于网格的数据源):

@Html.HiddenFor(x => x.CountryCode, new { data_bind = "value: CountryCode" }) // underscore becomes dash 

或者你可以只使用:

<input type="hidden" name="CountryCode" id="CountryCode" data-bind = "value: CountryCode"/>