【问题标题】:ASP.NET MVC Stateless NatureASP.NET MVC 无状态性质
【发布时间】:2011-12-09 13:36:58
【问题描述】:

这是一个概念性问题。

据我所知,MVC 具有无状态特性。 当我在浏览器中点击重新加载 (F5) 时,我在视图中写入或更改的值不会消失,也不会被模型中的原始值替换。

有人知道为什么会这样吗? 我假设在我重新加载页面的那一刻,修改后的“未提交”值应该消失。

我的视图只是剃须刀代码...我不使用 Web 表单(我的意思是,我的应用程序中没有 .aspx 页面)


@model PruebaMVC.Models.DatosLINQ.OPERACION

@{
    ViewBag.Title = "Edit";
}

<h2>Editar Operación</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>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Operación</legend>

        @Html.HiddenFor(model => model.IDOperacion)

        <div class="editor-label">
            @Html.LabelFor(model => model.FechaOperacion, "Fecha de la Operación")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.FechaOperacion)
            @Html.ValidationMessageFor(model => model.FechaOperacion)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Comision, "Comisión")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Comision)
            @Html.ValidationMessageFor(model => model.Comision)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Legajo, "Número de Legajo")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Legajo)
            @Html.ValidationMessageFor(model => model.Legajo)
        </div>

        <p>
            <input type="submit" class="formbutton" value="Guardar Cambios" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Volver al listado de Operaciones", "Index")
</div>

我希望不要通过提出概念性问题来影响网站的任何规则。如果我是,请告诉我,这样我就不会再这样做了。

【问题讨论】:

  • 能否提供一个简单的代码示例?
  • 你能看到网络流量吗?可能是浏览器缓存的情况
  • @neontapir:这里有代码。

标签: asp.net-mvc-3 stateless


【解决方案1】:

ASP.NET MVC HTML 助手将使用发布的值来重新创建表单。如果您想确保模型的值被推送到您的视图,请将它们从控制器的模型状态中删除。

你可以使用任何一个

public ActionResult MyController (MyModel model)
{
    if (ModelState.IsValid)
    {
        ModelState.Clear ();
    }

    return View (model);
}

或者您可以删除要更新的特定项目

public ActionResult MyController (MyModel model)
{
    if (ModelState.IsValid)
    {
        ModelState.Remove ("PropertyNameToRemove");
    }

    return View (model);
}

我不确定您在哪里进行更新(在控制器中手动或在模型本身中),但您只需从 ModelState 中删除任何或所有项目,它们就会被重新填充。

See this question, as well.

【讨论】:

  • 但问题是我没有提交页面,我从未到达“POST”ActionResult。不管怎样,现在我明白你在说什么,这个链接真的很有帮助。如果 ASP.NET MVC 实现了那些 HTML Helpers,那么他们大谈特谈的无状态本质在哪里?
  • 您是否正在加载页面、提交并按 F5?
  • 但是,如果我从模型状态中删除值(我认为,这应该在模型传递给 View() 的“GET”ActionResult 中完成)原始值如何会显示在视图中吗?
  • 首先,如果您提交表单,然后按 F5,取决于您的浏览器,它只会刷新您当前的屏幕——这意味着您将看到您获得后的所有内容回页。这执行 HTTPGET。其次,当您从 ModelState 中删除一个或多个属性时,它并没有从您的模型中删除它。它正在从他发布的值中删除它。
  • 你是对的,如果你没有提交表单,值应该回到原来的状态。
猜你喜欢
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多