Множественное частичное представление на одной и той же странице, открытое одно за другим по запросу, возвращает одну и ту же модель при отправке - PullRequest
0 голосов
/ 09 декабря 2011

Мы используем MVC3 для разработки приложения. Нам нужно создать несколько объектов - например, клиентов - с главной страницы. То же частичное представление используется для создания этой сущности. Эти частичные представления загружаются в диалоговое окно модели Jquery (используются различные теги div) один за другим по требованию при нажатии на ссылку / кнопку. Когда мы создаем первую сущность, она создается успешно, и соответствующий ключ устанавливается на главной странице. Но когда мы пытаемся создать вторую сущность, данные, передаваемые в контроллер, такие же, как и первая, и возникает исключение из-за ограничения уникального ключа. Мы попытались добавить Modelstate.clear (), но безуспешно. Теперь сюрприз заключается в том, что если мы добавим сущности снизу, нажав кнопку в обратном порядке (то есть 3,2,1), он будет создан. Кто-нибудь может решить это?

Контроллер для частичного просмотра Загрузка и отправка

 public PartialViewResult _CustomerCreate()
    {
        CustomerViewModel customerviewmodel = new CustomerViewModel();
        ModelState.Clear();
        return PartialView(customerviewmodel);
    }
public ActionResult _CustomerCreate(CustomerViewModel customerviewmodel)
    {
        CustomerBL customerBL = new CustomerBL();
        ModelState.Clear();
        if (ModelState.IsValid)
        {
            string path = Request.UrlReferrer.AbsolutePath;
        }
        int id = customerBL.SaveData(customerviewmodel);
        string customer = Convert.ToString(customerviewmodel.FSTNAME + " " + customerviewmodel.MDLNAME + " " + customerviewmodel.LSTNAME);

        return Json(new { Customerid = id, CustomerName = customer });
    }

Пример сценария на главной странице, который загружает частичное представление в диалог Jquery

<script type="text/javascript">
$(function () {

    $(".divnewnominee").dialog({
        autoOpen: false, width: 800, height: 590, modal: true,
        buttons: {
            "Save": function () {
                 if ($("#CustomerFormID").validate().form()) {
                $.post("/Customer/_CustomerCreate",
                    $("#CustomerFormID").serialize(),
                    function (data) {
                        $("#NOMINAME").val(data.CustomerName);
                        $("#NOMINEE").val(data.Customerid);
                        $(".divnewnominee").dialog("close");

                    });
                   }
            },
            Cancel: function () { $(this).dialog("close"); }
        }
    });

    $(".newnominee").click(function () {

        $(".divnewnominee").html("")
            .dialog("option", "title", "New Customer")
            .load("/Customer/_CustomerCreate", function () { $(".divnewnominee").dialog("open"); });
    });

});

<script type="text/javascript">
$(function () {

    $(".divfamily").dialog({
        autoOpen: false, width: 800, height: 590, modal: true,
        buttons: {
            "Save": function () {
                 if ($("#CustomerFormID").validate().form()) {
                $.post("/Customer/_CustomerCreate",
                    $("#CustomerFormID").serialize(),
                    function (data) {
                        $("#DEPOSITCUST").val(data.CustomerName);
                        $("#DEPOSITBY").val(data.Customerid);
                        $(".divfamily").dialog("close");

                    });
                   }
            },
            Cancel: function () { $(this).dialog("close"); }
        }
    });

    $(".newfamily").click(function () {

        $(".divfamily").html("")
            .dialog("option", "title", "New Customer")
            .load("/Customer/_CustomerCreate", function () { $(".divfamily").dialog("open"); });
    });

});

Частичное представление, которое загружается в div

@model ccs.Models.ViewModels.CustomerViewModel

@{
ViewBag.Title = "Create";
}

<h2>Customer</h2>



<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<script src="../../Scripts/ccsjs/ChooseFromList.js" type="text/javascript"> </script>
<script type="text/javascript">
$(function () {

    $("#dialog").dialog({
        autoOpen: false, width: 800, height: 500, modal: true,
        buttons: {
            "Save": function () {
                if ($("#AddressLookup").validate().form()) {
                    $.post("/Customer/AddressLookupCreate",
                    $("#AddressLookup").serialize(),
                    function (data) {
                        $("#CustAddress").val(data.address);
                        $("#AddrID").val(data.Adressid);
                        $("#dialog").dialog("close");

                    });
                }
            },
            Cancel: function () { $(this).dialog("close"); }
        }
    });

    $(".Address").click(function () {

        $("#dialog").html("")
            .dialog("option", "title", "Address")
            .load("/Customer/_AddressLookupCreate", function () { $("#dialog").dialog("open"); });
    });

});

<script type="text/javascript" >

$(function () {

    $("#addr").dialog({
        autoOpen: false, width: 800, height: 550, modal: true,
        buttons: {

            "Add": function () {
                if ($("#AddressLookupList").validate().form()) {
                    $.post("/Customer/_AddressLookupList",
                    $("#AddressLookupList").serialize(),
                    function (data) {
                        $("#CustAddress").val(data.address);
                        $("#AddrID").val(data.Adressid);
                        $("#addr").dialog("close");

                    });
                }
            },
            Cancel: function () { $(this).dialog("close"); }

        }
    });

    $(".searchaddr").click(function () {

        $("#addr").html("")
            .dialog("option", "title", "Address List")
            .load("/Customer/_AddressLookupList", function () { $("#addr").dialog("open"); });
    });
});

 <script type="text/javascript">
 $(function () {
     $("#divcust").dialog({
         autoOpen: false, width: 250, height: 500, modal: true
     });

     $("#custbtn").click(function () {
         $("#divcust").html("")
            .dialog("option", "title", "Customer List")
            .load("/Customer/_CustomerList", function () { $("#divcust").dialog("open"); });
     });
 });

@using (Html.BeginForm("_CustomerCreate", "Customer", FormMethod.Post, new { id="CustomerFormID" }))

{
 @Html.ValidationSummary(true)
<fieldset>
    <legend>Create</legend>
     <div style="float:left; width:100%;">
    <div class="row-style">
    <div class="labels">
        @Html.Label("Customer Code")
    </div>     


    <div id="Cust" class="fields">
       @Html.TextBoxFor(model => model.CUSTCODE)
        <div>@Html.ValidationMessageFor(model => model.CUSTCODE)</div>

    </div>

     <div class="labels">
        @Html.Label("First Name")
    </div>

    <div class="fields">
        @Html.EditorFor(model => model.FSTNAME)
        <div> @Html.ValidationMessageFor(model => model.FSTNAME)</div>

    </div>
    </div>
    <div class="row-style">
     <div class="labels">
        @Html.Label("Middle Name")
    </div>

    <div class="fields">
        @Html.EditorFor(model => model.MDLNAME)
        @Html.ValidationMessageFor(model => model.MDLNAME)
    </div>

    <div class="labels">
        @Html.Label("Last Name")
    </div>

     <div class="fields">
        @Html.EditorFor(model => model.LSTNAME)
        @Html.ValidationMessageFor(model => model.LSTNAME)
    </div>

    </div>
    <div class="row-style">
     <div class="labels">
        @Html.Label("Date of Birth")
    </div>


    <div class="fields">

        @Html.TextBoxFor(model => model.DOB, new { @class = "datePicker", id = "DOB", style = "width:170px;" })
        <div> @Html.ValidationMessageFor(model => model.DOB)</div>

    </div>

    <div class="labels">
        @Html.Label("Gender")
    </div>


     <div class="fields">
        @Html.DropDownListFor(model => model.Gender, new SelectList(Model.Gendr, "Key", "Value", " "), new { style = "width:205px;" }) 
        @Html.ValidationMessageFor(model => model.Gender)
    </div>
    </div>
    <div >
    <div class="labels">
       @Html.Label("Address ")
    </div>

    <div class="fields">
        @Html.TextAreaFor(model => model.ADDRESS, new { @name = "ADDRESS", @readonly = "readonly", style = "width:170px;height:50px;" ,id="CustAddress"})
                <img src="../../Content/themes/base/ccsimages/Search-icon.png" class="searchaddr" alt="Account Code" />
                <img src="../../Content/themes/base/ccsimages/New.jpg" alt="Account Code" class="Address" width="16Px" height="16Px"/>                   
               @* @Html.ActionLink("New Address", "AddressCreate")*@
        @Html.ValidationMessageFor(model => model.ADDRESS)
    </div>

    <div class="labels">
        @Html.Label("Photo ")
    </div>



    <div class="fields">            
     <p>
               <input type="file" id="PhotoUpload" name="PhotoUpload" />
    </p>    
    </div>              
     </div> 
    <div class="row-style"> 
    <div class="labels">
        @Html.Label("Pan No")
    </div>

     <div class="fields">
        @Html.EditorFor(model => model.ITPAN)
        <div>@Html.ValidationMessageFor(model => model.ITPAN)</div>

    </div>

    <div class="labels">
        @Html.Label("Tax Circle/Ward/District")
    </div>

    <div class="fields">
        @Html.EditorFor(model => model.WARD)
        @Html.ValidationMessageFor(model => model.WARD)
    </div>

    </div> 
    <div class="row-style">
     <div class="labels">
        @Html.Label("Mobile No")
    </div>

    <div class="fields">
        @Html.EditorFor(model => model.MOBILE)
        @*@Html.CheckBoxFor(model => model.SNDSMS, new { @value = Model.MOBILE, @onchange = "check(value)" })*@
        <div> @Html.ValidationMessageFor(model => model.MOBILE)</div>

    </div>

    <div class="labels">
        @Html.Label("Email ")
    </div>

    <div class="fields">
        @Html.EditorFor(model => model.EMAIL)
        @*@Html.CheckBoxFor(model => model.SNDMSG)*@
        <div> @Html.ValidationMessageFor(model => model.EMAIL)</div>

    </div>
       </div>       
    <div class="row-style">

    <div class="labels">
        @Html.Label("Phone No ")
    </div>

    <div class="fields">
        @Html.EditorFor(model => model.PHONE)
        <div> @Html.ValidationMessageFor(model => model.PHONE)</div>

    </div>

    <div class="labels">
        @Html.Label("Fax ")
    </div>

     <div class="fields">
        @Html.EditorFor(model => model.FAX)
        <div>@Html.ValidationMessageFor(model => model.FAX)</div>

    </div>
    </div>
    <div class="row-style">
     <div class="labels">
        @Html.Label("Family")
    </div>

     <div class="fields">
         @Html.DropDownListFor(model => model.FMLY, new SelectList(Model.Famly, "Key", "Value", " "), new { style = "width:205px;" }) 
        @Html.ValidationMessageFor(model => model.FMLY)
    </div>

    <div class="labels">
        @Html.Label("Customer Type")
    </div>

    <div class="fields">
       @Html.DropDownListFor(model => model.CUSTYPE, new SelectList(Model.CustTyp, "Key", "Value", " "), new { style = "width:205px;" }) 
        @Html.ValidationMessageFor(model => model.CUSTYPE)
    </div>
    </div>
    <div class="row-style">
    <div class="labels">
        @Html.Label("Repledge")
    </div>

     <div class="fields">
        @Html.DropDownListFor(model => model.REPLEDG, new SelectList(Model.Repldg, "Key", "Value", " "), new { style = "width:205px;" }) 
        @Html.ValidationMessageFor(model => model.REPLEDG)
    </div>

    <div class="labels">
        @Html.Label("ID Proof Type")
    </div>

     <div class="fields">
         @Html.DropDownListFor(model => model.IDPRTYPE, new SelectList(Model.IdProoflist, "IDPRCODE", "IDPRNAME", " "), new { style = "width:205px;" }) 
        @Html.ValidationMessageFor(model => model.IDPRTYPE)
    </div>
    </div>
    <div class="row-style">
    <div class="labels">
        @Html.Label("ID Proof No")
    </div>

    <div class="fields">
        @Html.EditorFor(model => model.IDPNO)
        @Html.ValidationMessageFor(model => model.IDPNO)
    </div>

    <div class="labels">
        @Html.Label("ID Proof ")
    </div>

    <div class="fields">            
     <p>
               <input type="file" id="IDProofUpload" name="IDProofUpload" />
    </p>       
    </div>
    </div>
   <div class="row-style">
    <div class="labels">
        @Html.Label("Father/Husband Name")
    </div>
   <div class="fields">
        @Html.TextBoxFor(model => model.FNAME, new { @name = "FNAME", @class = "FNAME", style = "width:170px;" })
        @*<img src="../../Content/themes/base/ccsimages/Search-icon.png" alt="Account Code" onclick="openCustPickerDialog(window, document.forms[0].FCUSTID,document.forms[0].FNAME, '/Customer/_CustomerLookupIndex/')"   />*@
        <img src="../../Content/themes/base/ccsimages/Search-icon.png" alt="Account Code" id="custbtn"/>
        @Html.ValidationMessageFor(model => model.FNAME)
        @Html.HiddenFor(model => model.FID)
    </div>
    </div>
    </div>
   @Html.HiddenFor(model => model.FCUSTID, new { @name = "FCUSTID",@class="FCUSTID", style = "width:130px;" })

    <div class="fields">
        @Html.HiddenFor(model => model.AVASRVCE)

    </div>
     <div class="fields">
        @Html.HiddenFor(model => model.ADDRID, new { @name = "ADDRID", style = "width:130px;",id="AddrID" })
        @Html.ValidationMessageFor(model => model.ADDRID)
    </div>

    @*<div id="NoteListBlock">@{Html.RenderPartial("_AddressLookupCreate");}</div>*@
    <div id="dialog" title="Address Lookup"></div>
    <div id="addr" title="Address"></div>
    <div id="divcust" title="Customer List"></div>
     <div class="row-style">
    <div class="errorfield">
     <div class="message"> @Html.ValidationMessageFor(model => model.CUSTCODE) @Html.ValidationMessageFor(model => model.FSTNAME) @Html.ValidationMessageFor(model => model.ADDRESS)</div>         
    </div>
    </div>
</fieldset>

}

При отправке First Div данные сохраняются должным образом. Когда Second отправляет, viewmodel сохраняет значения из первого div

1 Ответ

0 голосов
/ 13 декабря 2011

Мы решили нашу проблему. Мы добавили одну строку кода в скрипт Java, который вызывал частичное представление. Код указан ниже

<script type="text/javascript">
$(function () {

    $(".divnewnominee").dialog({
        autoOpen: false, width: 800, height: 590, modal: true,
        buttons: {
            "Save": function () {
                 if ($("#CustomerFormID").validate().form()) {
                $.post("/Customer/_CustomerCreate",
                    $("#CustomerFormID").serialize(),
                    function (data) {
                        ***$(".divnewnominee").html(data);***
                        $("#NOMINAME").val(data.CustomerName);
                        $("#NOMINEE").val(data.Customerid);
                        $(".divnewnominee").dialog("close");

                    });
                   }
            },
            Cancel: function () { $(this).dialog("close"); }
        }
    });

    $(".newnominee").click(function () {

        $(".divnewnominee").html("")
            .dialog("option", "title", "New Customer")
            .load("/Customer/_CustomerCreate", function () { $(".divnewnominee").dialog("open"); });
    });

});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...