MVC单页应用程序无法正常工作

时间:2017-10-24 01:37:29

标签: c# asp.net-mvc asp.net-mvc-4 singlepage

Greatings:D,我是MVC菜鸟,我承认。我正在进行一个测试项目,让我自己调整这个想法。这是十六进制程序的超级简单文本。

我会分解它正在做什么,然后发生了什么。

我有我的观点,它有一个textarea和一个提交按钮。用户输入数据类型,点击提交。

@model MVC.Models.ClsTextToHex

@{
    ViewBag.Title = "Text To Hex";
}

<h2>Convert To Hex</h2>

<form method="post">
    <textarea name="message" style="margin: 0px; width: 313px; height: 150px"> @Model.HexText</textarea>

  <div>
    <input type="submit" value="Convert" />
  </div>
</form>

它转到控制器:

[HttpPost]
    public ActionResult CTHView(ClsTextToHex ConvertToHex, string message)
    {
        ConvertToHex.ConvertTTH(message, ConvertToHex.Hexed);
        return CTHView(ConvertToHex);
    }

Controller然后与我的模型对话,它设置两个变量1.RealText(包含它是什么)和2.Hexed(包含Hex ...)。我的控制器然后重新加载视图,现在显示十六进制而不是文本。

HexImage

然而,现在我想将十六进制转回文本。我的模型有代码,但由于模型每次都重置,我无法跟踪重新发送值或更新新内容的任何内容,它只是将文本转换为十六进制。

所以我的noob问题归结为......我怎样才能使用模型来清理我的变量数据每次都不干净的地方。或者我只是在错误的轨道上?我来自一个基于C#应用程序的背景,所以做这样的事情就像初始化一个类,设置值并将它们传递出去一样简单......(虽然我真的不需要那样做,但我可以)似乎有点棘手的是asp.net ......

我已经阅读了很多答案,并看过视频,在任何人说出任何我想要解决的单页之前。实际上,我没有看到任何理由这不能是一页而不是两页,虽然我见过的大部分内容通常只会将您带到一个具有相同外观的新页面,诱使用户认为它是相同的页。我得到了这个概念,只是感觉不到它是如何发挥作用的。

1 个答案:

答案 0 :(得分:0)

基本上每次转换纯文本时,都需要在某处跟踪该信息(将纯文本转换为十六进制),以便下次提交表单时可以使用它来确定是否转换为十六进制或转换它回到纯文本。

由于Http是无状态的,我们需要在表单提交请求中发送状态。因此,每次将纯文本转换为十六进制时,请在表单中保留一个布尔变量,其值为true,并在表单提交时检查它。

您可以将此布尔属性添加到视图模型类中。

public class ClsTextToHex
{
    public string Text { set; get; }
    public bool IsHex { set; get; }
}

在您看来,将其保存在隐藏变量中。根据此布尔属性的值,您还可以有条件地更新按钮文本。

@model YourNameSpaceGoesHere.ClsTextToHex
@using (Html.BeginForm("ToHex", "Home"))
{    
    @Html.HiddenFor(f => f.IsHex)
    @Html.TextAreaFor(f => f.Text)
    <div>
        @{
           var btnText = Model != null && Model.IsHex ? "Convert back" : "Convert to Hex";
        }
        <input type="submit" value="@btnText"/>    
    </div>
}

现在您要做的就是在HttPost操作中检查此属性值。需要记住的重要一点是,由于我们正在更新视图模型的属性值并发送到同一视图,因此我们需要显式清除模型状态字典以便帮助方法({{1 }}和TextAreaFor)将使用正确(更新)的值。您可以使用HiddenFor方法执行此操作。

ModelState.Clear()