2014-09-25 59 views
0

我有SubsidiaryClient類和Client這涉及一個對許多人來說,如下 enter image description here設定值Html.HiddenField不綁定到模型後提交表單

我使用MVC 5開發中的圖片看到,並在創建SubsidiaryClient頁面中,獲取ClientID,單擊按鈕瀏覽以查找客戶端(使用模態窗體)。

選擇客戶端後,我使用javascript在@Html.HiddenField(model => model.ClientID)中設置clientID,填寫其餘字段並提交。

提交之前,我打印出ClientID,值爲1.然後提交表單後,ClientID未正確綁定。該值仍然爲0,爲什麼?如何正確綁定ClientID

Create.cshtml(查看)

@model Sales.ViewModels.SubsidiaryClientViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Subsidiary Client</h4> 
     <hr /> 
     @Html.ValidationSummary(true) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.ClientID, new { @class = "control-label col-md-3" }) 
      <div class="col-md-9"> 
       <div class="form-inline"> 
        @Html.HiddenFor(model => model.ClientID) 
        @Html.EditorFor(model => model.Client.Name, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } }) 
        <button class="btn btn-primary" id="btnLookupClient" data-toggle="modal" data-target="#clientModal">...</button> 
       </div> 
       @Html.ValidationMessageFor(model => model.Client.Name) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-3" }) 
      <div class="col-md-9"> 
       @Html.EditorFor(model => model.Name) 
       @Html.ValidationMessageFor(model => model.Name) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-3 col-md-9"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

@section Scripts { 
    <script> 
     function setClient(clientID, name) { 
      document.getElementById("ClientID").value = clientID; 
      document.getElementById("Client_Name").value = name; 
      $("#clientModal").modal("hide"); 
     } 
    </script> 
} 

SubsidiaryClientViewModel.cs

public class SubsidiaryClientViewModel 
{ 
    public int SubsidiaryClientID { get; set; } 

    [Required] 
    [Display(Name = "Client")] 
    public int ClientID { get; set; } 

    [Required] 
    [StringLength(20)] 
    [Display(Name = "Subsidiary Client No")] 
    public string SubsidiaryClientNo { get; set; } 

    [Required] 
    [StringLength(50)] 
    [Display(Name = "Subsidiary Client Name")] 
    public string Name { get; set; } 

    public ClientViewModel Client { get; set; } 
} 

生成的HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>Create</title> 
    <link href="/Content/bootstrap.css" rel="stylesheet"/> 
    <link href="/Content/site.css" rel="stylesheet"/> 
    <script src="/Scripts/modernizr-2.6.2.js"></script> 
</head> 
<body> 
<div class="container body-content"> 
    <h2>Create</h2> 

    <!-- Client Modal --> 
    <div class="modal fade" id="clientModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
     <div class="modal-dialog modal-lg"> 
      <div class="modal-content"> 
       <div class="modal-header"> 
        <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
        <h4 class="modal-title" id="myModalLabel">Lookup Client</h4> 
       </div> 
       <div class="modal-body" id="lookup-client-container"> 
        ... 
       </div> 
      </div> 
     </div> 
    </div> 

<form action="/SubsidiaryClient/Create" method="post"><input name="__RequestVerificationToken" type="hidden" value="7GIpLUIuv1DuqCtbq7KNAyTCg9IwwzxF8qZw6c8MZI-ZjpuAiavJBnjVEwABajZG9VgxODl3SfUi47voRM4vauo_uRMqL4ouxpIhXNNT-KAxqhvQIXpNDBBeEonOjrkr0" /> <div class="form-horizontal"> 
     <h4>Subsidiary Client</h4> 
     <hr /> 


     <div class="form-group"> 
      <label class="control-label col-md-3" for="OfficeID">Office</label> 
      <div class="col-md-9"> 
       <select class="form-control" data-val="true" data-val-number="The field Office must be a number." data-val-required="The Office field is required." id="OfficeID" name="OfficeID"><option value="">-- Please Select --</option> 
<option value="1">Office 1</option> 
<option value="3">Office 3</option> 
<option value="2">Office 2</option> 
</select> 
       <span class="field-validation-valid" data-valmsg-for="OfficeID" data-valmsg-replace="true"></span> 
      </div> 
     </div> 

     <div class="form-group"> 
      <label class="control-label col-md-3" for="ClientID">Client</label> 
      <div class="col-md-9"> 
       <div class="form-inline"> 
        <input data-val="true" data-val-number="The field Client must be a number." data-val-required="The Client field is required." id="ClientID" name="ClientID" type="hidden" value="0" /> 
        <input class="form-control text-box single-line" data-val="true" data-val-length="The field Name must be a string with a maximum length of 50." data-val-length-max="50" data-val-required="The Name field is required." id="Client_Name" name="Client.Name" readonly="readonly" type="text" value="" /> 
        <button class="btn btn-primary" id="btnLookupClient" data-toggle="modal" data-target="#clientModal">...</button> 
       </div> 
       <span class="field-validation-valid" data-valmsg-for="Client.Name" data-valmsg-replace="true"></span> 
      </div> 
     </div> 

     <div class="form-group"> 
      <label class="control-label col-md-3" for="SubsidiaryClientNo">Subsidiary Client No</label> 
      <div class="col-md-9"> 
       <div class="form-inline"> 
        <input class="form-control text-box single-line" data-val="true" data-val-length="The field Subsidiary Client No must be a string with a maximum length of 20." data-val-length-max="20" data-val-required="The Subsidiary Client No field is required." id="SubsidiaryClientNo" name="SubsidiaryClientNo" readonly="readonly" type="text" value="" /> 
        <button class="btn btn-primary" id="btnLookupSubsidiaryClient" data-toggle="modal" data-target="#subsidiaryClientModal">...</button> 
       </div> 
       <span class="field-validation-valid" data-valmsg-for="SubsidiaryClientNo" data-valmsg-replace="true"></span> 
      </div> 
     </div> 

     <div class="form-group"> 
      <label class="control-label col-md-3" for="Name">Subsidiary Client Name</label> 
      <div class="col-md-9"> 
       <input class="form-control text-box single-line" data-val="true" data-val-length="The field Subsidiary Client Name must be a string with a maximum length of 50." data-val-length-max="50" data-val-required="The Subsidiary Client Name field is required." id="Name" name="Name" readonly="readonly" type="text" value="" /> 
       <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span> 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-3 col-md-9"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
</form> 

<div> 
    <a href="/SubsidiaryClient">Back to List</a> 
</div> 
    </div> 

    <script src="/Scripts/jquery-1.10.2.js"></script> 
    <script src="/Scripts/jquery.unobtrusive-ajax.js"></script> 
    <script src="/Scripts/bootstrap.js"></script> 
<script src="/Scripts/respond.js"></script> 
<script src="/Scripts/bootstrap-hover-dropdown.js"></script> 
    <script> 
     $(document).ready(function() { 
      $("#ClientID").prop("disabled", true); 

      // -- end of #OfficeID change handler --- 

      $("#btnLookupClient").click(function (e) { 
       e.preventDefault(); 
       if ($("select[name='OfficeID'] option:selected").index() <= 0) { 
        alert("Please select office"); 
        $("#OfficeID").focus(); 
        $("#clientModal").one("show.bs.modal", function (e) { 
         return e.preventDefault() 
        }); 
       } 
       var url = '/Client/Search?officeID=' + $("#OfficeID").val(); 
       $.get(url) 
        .done(function (data) { 
         $("#lookup-client-container").html(data); 
         $("#clientModal").modal(show = true, backdrop = true); 
        }); 
      }); 
     }); 

     function setClient(clientID, name) { 
      document.getElementById("ClientID").value = clientID; 
      document.getElementById("Client_Name").value = name; 
      $("#clientModal").modal("hide"); 
     } 

     function setSubsidiaryClient(subsidiaryClientNo, name) { 
      document.getElementById("SubsidiaryClientNo").value = subsidiaryClientNo; 
      document.getElementById("Name").value = name; 
      $("#subsidiaryClientModal").modal("hide"); 
     } 
    </script> 

<!-- Visual Studio Browser Link --> 
<script type="application/json" id="__browserLink_initializationData"> 
    {"appName":"Internet Explorer","requestId":"3afa98d46b7d4e6683875cd03344fa12"} 
</script> 
<script type="text/javascript" src="http://localhost:52603/eaec46bd244a4d89804bf84d4e75d253/browserLink" async="async"></script> 
<!-- End Browser Link --> 

</body> 
</html> 
+0

您是否正在檢查'ClientID'或'Client.ClientID'的值?爲什麼不使用綁定到ClientID的下拉列表選擇客戶端? – 2014-09-25 03:47:19

+0

@StephenMuecke我改變之前使用dropdownlist這種方式,它的工作原理,但改變後它不起作用 – Willy 2014-09-25 03:59:17

+2

你的腳本設置'$(「#ClientID」)。prop(「disabled」,true);'。禁用的控件不會回發! – 2014-09-25 04:07:51

回答

1

它,因爲你有

$("#ClientID").prop("disabled", true);

代碼中的某處。

如果您將輸入設置爲「已禁用」,模型將不會綁定該值。