【问题标题】:Getting value from controller to view in ASP.NET MVC从控制器获取价值以在 ASP.NET MVC 中查看
【发布时间】:2019-02-19 19:48:36
【问题描述】:

我正在尝试获取从控制器传递到视图的数据。我相信我真的很接近,但我错过了一些小片段。

控制器:

namespace ePolicy.ConsumerPortal.Controllers
{
    [HandleErrors]
    public class TwoFAController : BaseController
    {
        [AcceptVerbs(new string[1] { "GET" })]
        public ActionResult SMS(string supplierId)
        {
            var model = new _2FASMSModel();
            return View("TwoFA_sms", model);
        }

        [AcceptVerbs(new string[1] { "POST" }), ValidateInput(false)]
        public ActionResult Initiate(FormCollection formValues, string email, string phone, string method)
        {
            return RedirectToAction("SMS", "TwoFA", new { phone = "1234567890"})
        }
    }
}

模型类:

public class _2FASMSModel : BaseModel
{
    public string Phone { get; set; }

    public _2FASMSModel()
    {
    }
}

视图(.aspx 文件)

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/ConsumerPortalNew.Master" Inherits="System.Web.Mvc.ViewPage<ePolicy.ConsumerPortal.Models._2FASMSModel>" Debug="true" %>
<%@ Import Namespace="ePolicy.Resources" %>
<%@ Import Namespace="ePolicy.Shared.Enumeration" %>
<%@ Import Namespace="System.Web" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
</asp:Content>

<asp:Content ID="login" ContentPlaceHolderID="MainContent" runat="server">
    <script type="text/javascript" src="<%: Url.StaticFile("/Scripts/TwoFA.js")%>"></script>
    <div>
       <p>@Model.Phone</p>
    </div>
</asp:Content>

我想做什么:我想在我的视图文件中显示字符串“1234567890”。

我的尝试:我能够将“1234567890”作为 URL 参数的一部分,但是我无法检索此字符串,因此我可以在我的视图中显示。

@Model.Phone 将被解释为文字字符串,而不是我想要的值(“1234567890”)。

我还尝试通过添加此行来使用ViewBag

ViewBag.Phone = supplierID

在返回视图之前。并在视图中调用它:

<p>ViewBag.Phone</p>

它也没有工作。

感谢任何帮助。

【问题讨论】:

  • 当 MVC 的流行(和 IMO 远远优于)视图引擎是 Razor 时,您使用 ASPX 是否有特殊原因?
  • @mason 我对此没有发言权。这是我(作为实习生)想从事的现有项目。
  • 哎哟。好吧,我向你表示哀悼。我希望您不要继续认为 ASPX(Web 窗体视图引擎)代表了整个框架的质量。它变得更好。
  • @mason 这真的很高兴听到。我真的不喜欢 ASPX。很高兴听到有更好的选择。
  • 将 public ActionResult SMS(string supplierId) 更改为 public ActionResult SMS(string phone) 并在返回之前执行 var model = new _2FASMSModel() {Phone = phone}

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


【解决方案1】:

我相信你需要改变:

<p>@Model.Phone</p>

到:

<p><%: Model.Phone %></p>

并且不要忘记用数据实际填充您的模型:

[AcceptVerbs(new string[1] { "GET" })]
public ActionResult SMS(string supplierId)
{
    var model = new _2FASMSModel() { Phone = "HTC 10" };
    return View("TwoFA_sms", model);
}

这至少应该在您的视图上显示一些动态数据。最后一步是将数据从一个控制器动作传递到另一个控制器动作。在 ASP.NET MVC 中,您可以使用控制器上的 TempData 属性。这是一本字典,您可以在其中存储一些数据,这些数据将在下一个请求时可用。看来这正是你想要的。

[AcceptVerbs(new string[1] { "GET" })]
public ActionResult SMS(string supplierId)
{
    var model = new _2FASMSModel() { Phone = TempData["Phone"] as string };
    return View("TwoFA_sms", model);
}

[AcceptVerbs(new string[1] { "POST" }), ValidateInput(false)]
public ActionResult Initiate(FormCollection formValues, string email, string phone, string method)
{
    TempData["Phone"] = "1234567890";
    return RedirectToAction("SMS", "TwoFA");
}

【讨论】:

  • 最后一行return RedirectToAction("SMS", "TwoFA", ),还有其他参数吗?因为它看起来像。
  • 不。忘记删除它。更新了我的答案:-)。我现在也只在 tempdata 中存储一个字符串而不是匿名对象,不需要该对象。
  • 错误发生在以下行:var model = new _2FASMSModel() { Phone = TempData["Phone"] }; 显然它将TempData["Phone"] 视为对象,并且无法将类型对象隐式转换为字符串
【解决方案2】:
[AcceptVerbs(new string[1] { "GET" })]

public ActionResult SMS(string supplierId){ var model = new _2FASMSModel();

model.Phone = "1234567890";

return View("TwoFA_sms", model); }

查看

@Html.LabelFor(model => model.Phone, htmlAttributes: new { @class= "control-label col-md-2" }) @Html.EditorFor(model => model.Phone , new { htmlAttributes = new { @class= "form-control" } }) @Html.ValidationMessageFor(model => model.Phone , "", new { @class= "text-danger" })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多