2017-04-20 7 views
1

私はMVC5ビューで剣道コンボボックスを実装しており、モデル内の値に基づいてフィルタリングするようにしました。私は私のモデルから値を取得する必要があります。私は現在、私の部分的な見解では、その値をCountryCodeという隠しフィールドにバインドしています。スクリプトは私のメインビューです。隠しフィールドにアクセスしようとすると、定義されていないエラーメッセージが表示されます。モデルにはCountryCodeが確実に取り込まれています。図メインビューから部分ビューで隠し要素を取得できません

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 ActionResult GetRequestStatus(string countryCode) 
     { 
      var response = requestRepository.GetRequestStatus(countryCode).AsQueryable().ProjectTo<RequestStatusViewModel>(); 

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

コントローラメソッドを移入

@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 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を参照してください。

したがって、各インスタンスがグリッド行から値を取得するように、剣道のMVVMバインディングを使用するように非表示に変更します。

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

それとも、ただ使用することができます:(国番号は、グリッドのデータソース内に存在する必要があります)

<input type="hidden" name="CountryCode" id="CountryCode" data-bind = "value: CountryCode"/> 
関連する問題