无法从主视图检索局部视图中的隐藏元素

Unable to retrieve the hidden element in partial view from main view

我已经在我的 MVC5 视图上实现了 kendo 组合框,并希望根据我的模型中的值过滤组合框。我需要从我的模型中检索值。我目前已将该值绑定到我的部分视图中名为 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() }
    };

我假设这是来自 kendo 网格的弹出窗口。问题是当单击任何行时视图被序列化并发送到弹出窗口。它不会像您在 MVC 中期望的那样绑定数据——它每次都发送相同的序列化数据。参见 here

因此,将您的隐藏更改为使用 kendo 的 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"/>