如何在不丢失数据的情况下将模型从视图传递到另一个视图?

时间:2018-11-23 16:50:02

标签: c# asp.net visual-studio asp.net-mvc-4 asp.net-mvc-viewmodel

我知道这个问题可能很奇怪,但是我试图将填充在一个View中并返回给我的Controller的数据传递给另一个View,以填充所有变量。我的问题是,每当我将从第一个视图正确接收的数据传递给第二个视图时,第二个视图都会向我返回一个新模型,仅包含数据,该模型填充在第二个视图中。为了更好地理解我的代码,

控制器:

    [HttpPost]
public IActionResult SubmitCharInfo(Character character) {
    //charRepo.SaveCharacter(character);
    return View("Char_StandartAttributes", character);
}

[HttpPost]
public IActionResult CharAllSkills(Character character) {
    charRepo.UpdateCharacter(character);
    return View("Char_FirstSkillPage");
}

我的第一个视图中的代码:

    @model Character

<form method="post" asp-action="SubmitCharInfo">
    <input type="hidden" asp-for="ownerID" />
    <input type="hidden" asp-for="charID" />
    <table  class="table table-bordered table-dark text-center">
        <tbody>
            <tr>
                <th>Enter a character name:</th>
                <td><input asp-for="charName" class="input-validation-error" data-for="true" data-val-required="Please enter your phone number" /></td>

            </tr>
            <tr>
                <th>Enter a age:</th>
                <td><input asp-for="charAge"/></td>
            </tr>
            <tr>
                <th>Enter a job:</th>
                <td><input asp-for="charJob" /></td>
            </tr>
            <tr>
                <th>Enter a place of residence:</th>
                <td><input asp-for="charPOR" /></td>
            </tr>
            <tr>
                <th>Enter a gender:</th>
                <td><input asp-for="charGender" /></td>
            </tr>
            <tr>
                <th>
                    <div data-valmsg-for="charStory" data-valmsg-replace="true" class="alert-danger"></div>
                    Enter a story:
                </th>
                <td><input asp-for="charStory" /></td>
            </tr>
            <tr>
                <td colspan="2">
                    <button type="submit" class="btn">Submit</button>
                </td>
            </tr>
        </tbody>
    </table>
</form>

这是我第二个视图的代码:

@model Character


<form method="post" asp-action="CharAllSkills">
    <table class="table table-bordered table-dark text-center">
        <thead>
            <tr>
                <th colspan="2"><h1>Standart Skills</h1></th>
            </tr>
            <tr>
                <th colspan="2"><h3>Enter a value for...</h3></th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <th>close range combat:</th>
                <td><input asp-for="standartSkills.AttackeNahkampf" /></td>
            </tr>
            <tr>
                <th>stamina:</th>
                <td><input asp-for="standartSkills.Ausdauer" /></td>
            </tr>
            <tr>
                <th>inteligence:</th>
                <td><input asp-for="standartSkills.Intelligenz" /></td>
            </tr>
            <tr>
                <th>strength: </th>
                <td><input asp-for="standartSkills.Koerperkraft" /></td>
            </tr>
            <tr>
                <th>strength:</th>
                <td><input asp-for="standartSkills.MentaleBelastbarkeit" /></td>
            </tr>
            <tr>
                <th>weapon handling:</th>
                <td><input asp-for="standartSkills.Waffenumgang" /></td>
            </tr>
            <tr>
                <td colspan="2">
                    <button type="submit" class="btn">Submit</button>
                </td>
            </tr>
        </tbody>
    </table>
</form>

以下是值的实时示例:

Values received from the first view

将模型传递到第二个视图并接收到我的模型数据后,更改为:

Values from the second view#1

Values from the second view#2

为什么会发生这种情况以及如何解决?

2 个答案:

答案 0 :(得分:0)

我不确定您的问题是否有意义,但这可能只是我对MVC缺乏了解。

page lifecycle指示要构建页面,处理回发,将整个内容发送给用户并尽快从内存中删除。将页面(视图+模型)发送给用户后,甚至将不再在内存中。数据不能持久保存在模型或视图中。

如果需要在回发之间保留数据,则必须将其保存在页面外的某个位置。数据库很常见。 ASP.Net还具有一些不太持久的与会话相关的存储方法。一旦有了数据持久性,就可以为模型A或模型B检索数据,这是一个琐碎的细节。

答案 1 :(得分:0)

返回视图后,它是一个新页面。将参数传递给视图是保留数据或从数据库重载数据的另一种方法。

新页面:数据->模型->视图->操作->消失了!

另一个新页面:数据->模型->视图->动作->消失了!

因此,您必须从一开始就重新加载。