【问题标题】:Best practice to display values after submitting form in ASP.NET MVC在 ASP.NET MVC 中提交表单后显示值的最佳实践
【发布时间】:2019-04-13 19:29:45
【问题描述】:

我对 ASP.NET 和 MVC 还很陌生,目前正在尝试以下方法:

  • 模型:表单的属性
  • 查看:向用户显示表单
  • 控制器:
    • 行动:做点什么
    • 返回初始视图并向用户显示值

使用普通的 html,我可以正常工作。到目前为止,使用 razor 语法,我无法在提交表单后重新显示值。

我的模特:

namespace MyModels
{
  public class SubmitTicketFormModel
  {
     [DisplayName("First Name")]
     public string _firstName { get; set; }

     [DisplayName("Last Name")]
     public string _lastName { get; set; }
  }
}

我的观点:

@model MyModels.SubmitTicketFormModel

@{
    ViewData["Title"] = "SubmitTicketView";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Request</h1>

@using (Html.BeginForm("SubmitTicketAction", "SubmitTicketContoller", FormMethod.Post))
{
    <div class="form-group">
        @Html.LabelFor(model => model._firstName)
        @Html.TextBoxFor(model => model._firstName, new { @class = "form-control" })

        @Html.LabelFor(model => model._lastName)
        @Html.TextBoxFor(model => model._lastName, new { @class = "form-control" })
    </div>

    <input type="submit" value="Post comment" />
}


<table class="table table-bordered table-sm">
    <thead class="thead-light">
        <tr>
            <th>col1</th>
            <th>col2</th>
        </tr>
    </thead>
    <tbody>

        <tr>
            <td>
                @Model._firstName
            </td>
            <td>
                @Model._lastName
            </td>
        </tr>

    </tbody>
</table>

控制器:

    public class SubmitTicketController : Controller
    {
        public ActionResult SubmitTicketView()
        {
            var TicketInstance = new SubmitTicketFormModel();
            return View(TicketInstance);
        }

        [HttpPost]
        public ActionResult SubmitTicketAction(SubmitTicketFormModel model)  
        {
            var NewTicketInstance = new SubmitTicketFormModel()
            {
                _firstName = model._firstName,
                _lastName = model._lastName
            };

            return View(NewTicketInstance);

        }
     }

 }

你能指导我正确的方向吗?

【问题讨论】:

  • 您能补充更多信息吗?喜欢一些功能的截图?您是否尝试将数据添加到数据库,然后在网格(表)中显示值?然后在这种情况下,您必须使用RedirectToAction 方法重定向到初始视图。
  • 可以添加视图名和文件夹名吗?
  • public ActionResult SubmitTicketAction 重命名为 public ActionResult SubmitTicketView`(当然,在您的 HTML.BeginForm 语句中以相同的方式更新名称),您应该一切顺利。您没有准确地说出了什么问题,但我认为这可能是因为没有与 SubmitTicketAction 关联的视图文件。
  • 我认为这应该可行,但我不确定这是一个很棒的设计。一方面,除了向您的表格添加详细信息外,它还会重新填充您的表单,因此人们很容易最终两次提交相同的数据。至少它会令人困惑。此外,如果人们回到该网站,他们应该如何在以后再次找到此信息?正常模式是保存数据,然后使用保存的 ID 作为查询字符串参数将用户重定向到“详细信息”页面 - 然后可以随时重复使用该 URL 以查看相同的项目
  • 附言。你真的不需要创建 NewTicketInstance 对象。您所做的只是创建一个相同的副本,而无需添加或更改任何内容。你可以直接做return View(model);

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


【解决方案1】:

如果您希望在用户单击提交按钮后呈现相同的视图,那么我想您不希望在UI 再次出现。只有您的视图中的名字和姓氏的值,您已在视图中写下您的逻辑。 在这种情况下,您可以从控制器中将 ViewBag 传递给您的视图,这将帮助您的视图了解它是否必须显示输入表单或显示用户输入的数据。

[HttpPost]
        public ActionResult SubmitTicketAction(SubmitTicketFormModel model)  
        {
            var NewTicketInstance = new SubmitTicketFormModel()
            {
                _firstName = model._firstName,
                _lastName = model._lastName
            };
            ViewBag.Check = "true";
            return View(ViewName , modelname);

        }

然后在你看来,

@model MyModels.SubmitTicketFormModel

@{
    ViewData["Title"] = "SubmitTicketView";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@if(ViewBag.Check != null)
{
<h1>Request</h1>

@using (Html.BeginForm("SubmitTicketAction", "SubmitTicketContoller", FormMethod.Post))
{
    <div class="form-group">
        @Html.LabelFor(model => model._firstName)
        @Html.TextBoxFor(model => model._firstName, new { @class = "form-control" })

        @Html.LabelFor(model => model._lastName)
        @Html.TextBoxFor(model => model._lastName, new { @class = "form-control" })
    </div>

    <input type="submit" value="Post comment" />
}
}
else
{

<table class="table table-bordered table-sm">
    <thead class="thead-light">
        <tr>
            <th>col1</th>
            <th>col2</th>
        </tr>
    </thead>
    <tbody>

        <tr>
            <td>
                @Model._firstName
            </td>
            <td>
                @Model._lastName
            </td>
        </tr>

    </tbody>
</table>
}

【讨论】:

  • 这是一个有趣的方法,我将尝试,非常感谢。
  • 我想在评论中询问您是要在提交后在同一个视图本身中显示数据,还是可以使用不同的视图。如果您想使用相同的视图,您是否希望再次显示该表单。但由于我没有足够的声誉来发表评论,所以不得不自己发布一个答案:P.
  • 是的。如果您只想显示用户提交的数据而不是表单本身,那么使用不同的视图会很好。并且已经有可用于创建、编辑、查看页面的模板。您所要做的就是右键单击您的 submitticketaction 方法,单击添加视图,然后选择 mvc 视图模板,然后从下拉列表中选择您的模型。然后它将创建一个视图,您可以在之后对其进行自定义。如果您对这种方法不熟悉,您可以在 Google 上搜索如何添加带有传递模式的 MVC 视图模板,然后您就可以完成工作了。
  • 感谢您和 ADysons 的提示,我现在对第一步感到满意。我通过右键单击操作添加了一个详细信息页面(非常方便的方式,谢谢)。在 HttpPost-Action 中,我将代码更改为“return View("Details",model);" .详细信息页面现在包含模板代码以及我在初始视图中用于显示提交值的表格。下一步将使用提交的变量进行 Jira API 调用。设计方面你会建议什么?在现有操作中进行 API 调用或创建由现有操作调用的新操作?
  • 好吧,我知道的不多,但这取决于。您想使用该 API 执行什么操作?获取还是发布?而且在调用之后,如果你只是想返回到同一个页面(这里是详细信息页面),并从 API 返回一些数据,那么你可以进行 Ajax 调用,它的语法非常简单。
猜你喜欢
  • 2017-11-03
  • 1970-01-01
  • 2022-11-22
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多