簡體   English   中英

在 Razor 視圖中更新 Model 時出現問題

[英]Issue with Updating Model in Razor View

第一篇文章。 嘗試解決我在 Razor 視圖和 model 之間看到的問題。 我有一個彈出窗口 window 正在輸入部分視圖和 model。

 public IActionResult ClickedCovid19Question(int id)
    {
        var existingQ = db.CustomerInfoItems.Find(id);

        var suffix = existingQ.Suffix;

        if (suffix.Length == 2)
            suffix = suffix.Insert(0, "0");

        var salesman = SalesmanHelper.GetSalesmanNum();

        var par = db.Pars.Where(p => p.AccountNo == existingQ.CustNum).Where(p => p.Suffix == suffix)
                    .Where(p => p.SalesmanNumber == salesman).FirstOrDefault();
        var clickedCovid19Model = new ClickedCovidQuestionModel
        { //insert model data here }
        
        clickedCovid19Model.Machines = db.MachinePopulationItems
            .Where(m => m.CustNum == existingQ.CustNum)
            .ToList();

        return View("~/Views/Covid19/_ClickedCovid19Question.cshtml", clickedCovid19Model);
    }

這在第一頁渲染上效果很好。 我看到數據填充了從 razor 頁面上的 @model 調用的 UI 元素。 當我的用戶在此處更新字段並提交時,我使用此 function

function SaveClickedCovid19Question(idJS) {
    C19ParChanged('@Model.Par');
    var jsonJS = SerializeForm("#c19QuestionForm");

    $.ajax({
        url: '/Covid19/SaveClickedCovid19Question',
        type: 'GET',
        data:
        {
            id: idJS,
            json: jsonJS
        },
        success: function (data) {
            Alert(data);
            RefreshLV("CovidQuestions");
            HideWindow("#Covid19Question");
        },
        error: function (data, error, e2) {
            debugger;
        }
    });
}

但是,在彈出 window 關閉並打開另一個彈出窗口后,我們調用相同的 ClickedCovid19Question IActionResult 再次填充我們的表單。 它使用它生成的新 model 填充 UI,調試顯示它創建了一個具有所有正確數據的新 model。 當用戶再次提交此表單時,問題就出現了,Razor 視圖上的 model 似乎認為它仍然是第一次提交的 model。 這方面的一個例子是 javascript function 的第一行。 在創建 razor 視圖時,它具有正確的 @Model.Par 數據,正如我在創建一些元素來顯示它時看到的那樣。 但是,當嘗試使用 @Model.Par 捕獲該數據時,它會捕獲原始 Model.Par 數據。 長話短說,后續彈出窗口不會覆蓋第一個彈出窗口中的 Model 數據。 我很難過,因為這個系統適用於我們代碼庫的許多其他領域。 我可以修復這個購買,創建隱藏元素來存儲我需要在任何請求中發送的數據,但我覺得必須有比這更好的答案。

編輯:下面是我用來測試的一個例子。 下面的視圖部分將始終在 id=parID 輸入框中顯示正確的 par 數據。 However, on the second popup and everytime after, if I was to run the simple javascript function below to find the data held by model, it will ALWAYS update to the data from the first model the page ever rendered, which seems inconsistent with other areas我的代碼可以正常工作。

function updateParID() {
        $("#c19QuestionForm").find("#parID").val('@Model.Par');

    }


<input id="parID" type="text" disabled="disabled" value="@Model.Par"/>
        <partial name="Forms/_FormDropDown" model=@(new FormDropDownModel { Name = "Par", Values = Lists.ParStates(), Value = Model.CallsPerYear}) />
        <button type="submit" onclick="RefreshWindow('@Model.ID')">Refresh</button>
        <button type="submit" onclick="updateParID()">Update Par ID</button>

@Model.Par(或您在 @Model 中擁有的任何道具)在瀏覽器中顯示任何內容之前呈現。 Razor 頁面將呈現您的視圖,然后將其傳遞給瀏覽器。 因此,如果您想使用 ajax 獲取數據,您應該手動將從 ajax 接收的數據放入您的 html 控件中。

有一個愉快的編碼日:)

所以,我實際上最終解決了這個問題。 My issue was, trying to bind the data from the @Model.Par or any model data INSIDE a javascript function will ALWAYS bind using the initial model. 對這個 function 的每個后續調用將始終只使用第一個 model。 My solution that I overlooked was to actually send the data to the function from the model as a parameter first, and not try to bind it inside the javascript function.

示例:我的編輯有這些行

function updateParID() {
        $("#c19QuestionForm").find("#parID").val('@Model.Par');

    }

<button type="submit" onclick="updateParID()">Update Par ID</button>

當我將捕獲 model 的順序更改為:

function updateParID(parID) {
        $("#c19QuestionForm").find("#parID").val(parID);

    }

<button type="submit" onclick="updateParID('@Model.Par')">Update Par ID</button>

這現在可以正確捕獲存在的 model 數據。 我確信 javascript 以這種方式工作是有原因的,但我不知道,是否有人可以闡明它。 如果這是一個簡單的答案,請原諒我,我是 web 編程的新手。 謝謝大家幫忙!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM